Linux Perl进程解析

Linux Perl进程解析,linux,perl,Linux,Perl,我正在用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

我正在用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;

您应该使用模块来完成此任务。

我在代码中添加了
%users
散列。另见:


我已经从ps命令中获得了所有正确的数据,甚至解析出了正确的字段,我认为我只需要为每个用户创建一个哈希,每个进程字符串作为一个键,如果键存在,则将处理器使用情况添加到该键的值中。“我只是不知道如何去促进它。”那个家伙,不要太快地对这个建议打折扣。今天,您可能会对自己所做的感到满意,但总有一天,您可能不想依赖1)特定发行版对2)外部命令的实现,该命令是通过系统的shell 3)从受PATH环境变量约束的位置运行的4)。当那一天到来时,你可能想使用一个经过测试/维护的模块,这样你就有了一个良好的开端。现在你真正的问题是什么?我想我只需要为每个用户创建一个散列,每个进程字符串作为一个键,如果键存在,将处理器使用情况添加到该键的值中。我只是不知道该怎么做。这会打印出所有进程的每个进程,我需要将httpd的所有使用情况相加为一个字符串和每个用户的总httpd,但不仅仅是httpd,对于任何用户运行的任何进程,它都需要是动态的。查看我想要的outlook,并与上面的ps stats进行比较。当需要在perl中按值查找某些内容时,哈希通常就是您要查找的数据类型。在您的例子中,您很可能看到散列。外部散列使用用户作为键,另一个散列作为其值。第二个散列将有一个进程名作为值。任何关于perl的好书或教程都会介绍哈希
use warnings;
use strict;

my @stats;
my $date=`date +"\%m-\%d-\%Y-\%r"`;
chomp $date;

my %users;
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';
        $users{$user}{$cmd} += $cpu;
        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;
for my $user (sort keys %users) {
    print "$user\n";
    print "($users{$user}{$_}): $_\n" for (sort keys %{ $users{$user} });
    print "\n";
}