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

1 098 посмотрели
Posted by Алексей Нещадим in IT | Tagged , | Leave a comment

Скрипт может оказаться полезным, особенно на серверах где одновременно выполняется большое количество процессов (когда глядя на вывод 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 и скопируйте в него вышеприведенный код скрипта.

cd /home/user
echo > ups
nano ups
вставить код (правой кнопкой мышки)
ctrl+o
ctrl+x

запускаем 🙂

./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

Добавить комментарий