You can start with Sys::CpuLoad, it works under
Linux and BSD; then you can glue it to Proc::ProcessTable.
Ciao, Valerio
Update: i wrote this little test:
#!/usr/bin/perl
use strict;
use Sys::CpuLoad;
use Proc::ProcessTable;
use vars qw( $sleep_time @memory $memory_size $count $threshold $progr
+am @pids );
$program = '/usr/bin/perl';
$threshold = 1; #load
$sleep_time = 1; #seconds
$memory_size = 10;
$count = 0;
while (1) {
if (load_average() > $threshold) {
@pids = search_procs();
if (@pids) {
killall(@pids);
}
}
$count++;
sleep $sleep_time;
}
exit;
sub load_average {
my ($last, $average);
$last = (Sys::CpuLoad::load())[0];
$memory[$count % $memory_size] = $last;
$average += $_ foreach @memory;
$average = $average / $memory_size;
return $average;
}
sub search_procs {
my ($ppt, $proc, @pids);
$ppt = new Proc::ProcessTable;
foreach $proc (@{$ppt->table}) {
next unless ($proc->{exec} eq $program);
push @pids, $proc->{pid};
}
return @pids;
}
sub killall
{
print join(' ', @_), "\n";
}
This code is only a proof of concept. |