perl の Linux ボックスでプロセスをループしています。特定のプロセスの合計 CPU を表示したいのですが、プロセスのすべてのインスタンスの合計使用量を表示したいと考えています。例:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
northriv 10228 0.0 0.2 23692 8084 ? S Sep18 0:00 /usr/local/apache2/bin/httpd -k start
northriv 10229 0.0 0.2 23692 8084 ? S Sep18 0:00 /usr/local/apache2/bin/httpd -k start
northriv 10186 0.0 0.2 23692 8084 ? S Sep18 0:00 /usr/local/apache2/bin/httpd -k start
northriv 10187 0.0 0.2 23692 8084 ? S Sep18 0:00 /usr/local/apache2/bin/httpd -k start
speaktra 25535 0.2 1.0 46788 33212 ? S Sep23 6:04 /usr/local/apache2/bin/httpd -k start
speaktra 25547 0.2 0.8 40320 26712 ? S Sep23 6:21 /usr/local/apache2/bin/httpd -k start
wvneuroc 1570 0.2 0.0 2136 1044 ? S 12:52 0:00 /usr/bin/qpopper -F -S
speaktra 25546 0.2 0.7 35680 22116 ? S Sep23 6:45 /usr/local/apache2/bin/httpd -k start
speaktra 1570 0.2 0.0 2136 1044 ? S 12:52 0:00 /usr/bin/qpopper -F -S
このようなものは、このようなユーザーとプロセスによって出力されます。
northriv
(0.0): /usr/local/apache2/bin/httpd
speacktra
(0.6): /usr/local/apache2/bin/httpd
(0.2): /usr/bin/qpopper -F -S
wvneuroc
(0.2): /usr/bin/qpopper -F -S
ある種のハッシュを使用する必要があることはわかっていますが、強力ではありません。これまでに使用したコードを次に示します。
!/usr/bin/perl
use strict;
use warnings;
my @stats;
my $date=`date +"\%m-\%d-\%Y-\%r"`;
chomp $date;
my @process_table = `ps aux --sort=\%cpu|sed -e 's/\\s\\+/,/g'`;
for (@process_table)
{ chomp;
$_ =~ s/ / /g;
my ($user,$pid,$cpu,$mem,$cmd)=(split /,/,$_)[0,1,2,3,10];
next if $user eq 'USER';
if($cpu > 10)
{
push(@stats,"$user - WARNING(CPU:$cpu):\t$pid($cmd)\n");
}
if($cpu > 50)
{
push(@stats,"$user - CRITICAL(CPU:$cpu):\t$pid($cmd)\n");
}
}
print $_ for @stats;