On Wednesday 01 October 2003 07:06 pm, [EMAIL PROTECTED] wrote:
> Hi,
>
> In order to get an email advising me that a process is using too much %cpu,
> i wanted to be able to redirect the output of the Unix top command into a
> text file, then use regular expressions to get the data i need.
> However, redirecting top's output into a file, ends up being one long line
> with a lot of  control-M characters and other funny characters like these:

Another way is to call top in batch mode (-b).  This tells top to not send any 
fancy control characters.  If you want to catch just one iteration though, 
you should also pass it "-n1" so that it doesn't just scroll screenfulls of 
top information on your terminal.

Attached is a little quickie program I wrote to watch various aspects of top's 
output over time.  It might help to show how one could process top data.

-- 
/* Michael A. Nachbaur <[EMAIL PROTECTED]>
 * http://nachbaur.com/pgpkey.asc
 */

"He expanded his chest to make it totally clear that here 
was the sort of man you only dared to cross if you had a 
team of Sherpas with you. "
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes qw ( time sleep );

{
    my $sleep_interval = shift @ARGV || 1;
    my $max_loops = shift @ARGV || -1;
    while ($max_loops-- != 0) {
        open INSTATS, 'top -b -n1 |'
            or die "I can't open top in batch mode\n";
        [EMAIL PROTECTED] perftest]$ top -b -n1
        #top - 14:58:20 up 30 days,  2:14, 43 users,  load average: 2.91, 2.93, 2.90
        #Tasks: 104 total,   4 running,  98 sleeping,   1 stopped,   1 zombie
        #Cpu0 :   4.4% user,  27.5% system,  67.8% nice,   0.3% idle
        #Cpu1 :   4.8% user,  26.0% system,  69.0% nice,   0.2% idle
        #Mem:   3616768k total,  2553312k used,  1063456k free,   225360k buffers
        #Swap:  2097136k total,     4948k used,  2092188k free,  2028244k cached
        my %data = ();
        while (my $line = <INSTATS>) {
            if ($line =~ /load average:\s+(.*?), (.*?), (.*)/) {
                $data{loadavg} = [$1, $2, $3];
            }
            if ($line =~ /Tasks:\s+(\d+) total,\s+(\d+) running,\s+(\d+) sleeping,\s+(\d+) stopped,\s+(\d+) zombie/) {
                $data{tasks} = {
                    total    => $1,
                    running  => $2,
                    sleeping => $3,
                    stopped  => $4,
                    zombie   => $5,
                };
            }
            if ($line =~ /Cpu(\d?).*:\s+(.*?)\% user,\s+(.*?)\% system,\s+(.*?)\% nice,\s+(.*?)\% idle/) {
                $data{"cpu$1"} = {
                    'user'   => $2,
                    'system' => $3,
                    'nice'   => $4,
                    'idle'   => $5,
                };
            }
            if ($line =~ /Mem:\s+(.*?)k total,\s+(.*?)k used,\s+(.*?)k free,\s+(.*?)k buffers/) {
                $data{mem}->{total}   = $1;
                $data{mem}->{used}    = $2;
                $data{mem}->{free}    = $3;
                $data{mem}->{buffers} = $4;
            }
            if ($line =~ /Swap:\s+(.*?)k total,\s+(.*?)k used,\s+(.*?)k free,\s+(.*?)k cached/) {
                $data{swap}->{total} = $1;
                $data{swap}->{used}  = $2;
                $data{swap}->{free}  = $3;
                $data{mem}->{cached} = $4;
            }
        }
        close INSTATS;
        print time . "\t";
        print "avg: (" . join(", ", @{$data{loadavg}}) . ")\t";
        print "proc: (" . join("/", $data{tasks}->{running}, $data{tasks}->{total}) . ")\t";
        print "mem: (" . join("/", $data{mem}->{used} - $data{mem}->{cached}, $data{mem}->{total}) . ")\n";
        sleep($sleep_interval);
    }
}

Reply via email to