man linux — заметки админа

6 сентября 2008

ups — суммарные показатели по нагрузкам

Скрипт может оказаться полезным, особенно на серверах где одновременно выполняется большое количество процесов (когда глядя на вывод ps aux приходится многократно прокручивать экран и трудно понять кто-же сколько потребляет в эту секунду).


Вот собственно скрипт:

#!/usr/bin/php -nd safe_mode=Off
<?
    if(@$_SERVER['argv'][1]=='h' || @$_SERVER['argv'][1]=='-h' || @$_SERVER['argv'][1]=='--help'){
    die("Use:\n\nups m|p|c\n\nOPTIONS:\n\nm - sort by %mem\np - sort by process\nc - sort by %cpu (if no options script use default option as c)\n\nUse:\nups --help\nfor see this help information\n");
    }
echo "\nUse: \"ups --help\" for see help information\n";
echo 'Uptime: '.exec('uptime')."\n\n";
if(@exec('/bin/ps aux',$pss)){
 
$tasks=sizeof($pss);
echo 'Running Tasks: '.$tasks."\n";
 
    for($i=1; $i<$tasks; $i++){
    preg_match("/([^ ]{1,})[ ]{1,}([^ ]{1,})[ ]{1,}([^ ]{1,})[ ]{1,}([^ ]{1,})[ ]{1,}([^ ]{1,})[ ]{1,}([^ ]{1,})[ ]{1,}([^ ]{1,})[ ]{1,}([^ ]{1,})[ ]{1,}([^ ]{1,})[ ]{1,}([^ ]{1,})[ ]{1,}(.*)/i",$pss[$i],$arr);
    $user=$arr[1];
    $pid=$arr[2];
    $cpu=$arr[3];
    $mem=$arr[4];
    $vsz=$arr[5];
    $rss=$arr[6];
    $tt=$arr[7];
    $stat=$arr[8];
    $started=$arr[9];
    $time=$arr[10];
    $command=$arr[11];
    list($time_h,$time_m)=split(':',$time);
        if(!isset($u[$user])){
        $u[$user]['process']=1;
        $u[$user]['cpu']=$cpu;
        $u[$user]['mem']=$mem;
        $u[$user]['vsz']=$vsz;
        $u[$user]['rss']=$rss;
        $u[$user]['time_h']=$time_h;
        $u[$user]['time_m']=$time_m;
        }else{
        $u[$user]['process']++;
        $u[$user]['cpu']=($u[$user]['cpu']+$cpu);
        $u[$user]['mem']=($u[$user]['mem']+$mem);
        $u[$user]['vsz']=($u[$user]['vsz']+$vsz);
        $u[$user]['rss']=($u[$user]['rss']+$rss);
        $u[$user]['time_h']=($u[$user]['time_h']+$time_h);
        $u[$user]['time_m']=($u[$user]['time_m']+$time_m);
        }
    }
$users=sizeof($u);
echo 'Active Users: '.$users."\n\nUSER     \t\tPROCESS\t%CPU\t%MEM\tVSZ\t\tRSS\t\tTIME\n";
    foreach($u as $user => $vars){
    $vars['time_m']=trim($vars['time_m']);
    $vars['time_h']=trim($vars['time_h']);
        if($vars['time_m']>60){
            while($vars['time_m']>=60){
            $vars['time_m']=($vars['time_m']-60);
            $vars['time_h']++;
            }
        }
        if(@$_SERVER['argv'][1]=='m'){
        $sort=trim($vars['mem']);
        }elseif(@$_SERVER['argv'][1]=='p'){
        $sort=trim($vars['process']);
        }else{
        $sort=trim($vars['cpu']);
        }
    $uarr[trim($user)."     \t\t".trim($vars['process'])."\t".trim($vars['cpu'])."\t".trim($vars['mem'])."\t".trim($vars['vsz'])."\t\t".trim($vars['rss'])."\t\t".trim($vars['time_h']).':'.trim($vars['time_m'])."\n"]=$sort;
    }
 
arsort($uarr);
reset($uarr);
    foreach($uarr as $k => $v){
    echo $k;
    }
 
}else{
echo 'Sorry, but your PHP configuration must alowe use "exec()" function in this php-scripts, and this script need safe_mode=off - try edit your php.ini file and mooved this script in /home directory';
}
 
 
echo "\n";
?>

Установка скрипта проста до безобразия — создайте файл ups и скопируйте в него вышеприведенный код скрипта. Первая строка (#!/usr/bin/php -nd safe_mode=Off) должна быть в самом начале, до нее не должно быть никаких пробелов или переносов строки.
Дайте скрипту права на выполнение:

chmod u+x ups

Запускать скрипт так:
./ups (вывод суммарных показателей с сортировкой по %CPU)
./ups -m (вывод с сортировкой по %MEM)
./ups -p (вывод с сортировкой по количеству процессов юзера)

Если при запуске скрипта получаете ошибку типа «No input file specified.» — переместите скрипт в директорию /home или в директорию /home/юзер/public_html (данная ошибка означает что не разрешен запуск скрипта из текущей директории, поэтому необходимо перенести его в директорию откуда разрешен запуск php-скриптов).

Для того чтобы облегчить запуск (сделать запуск по команде ups), можно создать сылку на скрипт в директории /usr/bin, например:

ln -s /home/юзер/ups /usr/bin/ups

P.S. Любителям чистоты кода просьба не пинать за строки с 15-ой по 42-ую — строки были созданы в процесе написания исключительно мне в качестве памятки, их избыточность прекрасно осознаю.


Автор: Виктор Симон
www.man-linux.ru
Права копирования
Опубликовано 6 сентября 2008 - информация могла устареть.

Комментариев нет »

No comments yet.

RSS feed for comments on this post.

Leave a comment

Для отправки комментария вам необходимо авторизоваться.

Powered by WordPress