#!/usr/bin/perl use strict; use Fcntl; my %conf=(timerstep=>5, fifo=>"./watchdog.add"); my @joblist=(); sub start_app($) { my $app_str=shift(@_); my $pid=fork() exec($app_str) unless($pid); print "$0: Programm \"$app_str\" wurde mit der PID: \"$pid\" gestartet\n"; return $pid; } sub add_job($$$) { my ($app_str,$timeout,$pid); push(@joblist,{app=>$app_str, time=>time(), timeout=>$timeout pid=>$pid, running=1}); } sub kill_job($) { my $pid=shift(@_); for my $job (@joblist) { if($job->{pid} == $pid) { $job->{running}=0; last; } } } sub test_jobs() { my $time=time(); for my $job (@joblist) { if($job->{time}+$job->{timeout} >= $time) { if(`ps -o "%c" -p $job->{pid}` eq $job->{$app_str}) { print "$0: \"$job->{$app_str}\" läuft noch nach $job->{timeout} Sekunden.\n"; } else { print "$0: \"$job->{$app_str}\" wurde vorzeitzig beendet.\n"; } kill_job($job->{pid}); } } } sub timeout() { test_jobs(); } ### Programm ### # fifo erzeugen unless(-p $conf{fifo}) { # kein FiFo if (-e $conf{fifo}) { die "$0: Werde $conf{fifo} nicht veändern!\n"; } else { require POSIX; POSIX::mkfifo($conf{fifo}, 0666) or die "mkfifo $conf{fifo} schlug fehl ($!)\n"; warn "$0: $conf{fifo} ist jetzt die Eingabedatei\n"; } } # timeout initialisieren $SIG{ALRM}=&timeout(); # timeout Zyklus setzen alarm $conf{timerstep}; # Eingaben lesen while(1) { sysopen(FIFO, $conf{fifo}, O_RDONLY) or die "kann $conf{fifo} nicht lesen ($!)\n"; my $in=join("",); close FIFO; exit(0) if($in=~/^exit\s*$/s); my ($pid,$timeout,$app_str)=split(':',$in,3); if( $app_str ne '' && int($timeout)>0 ) { $pid=start_app($app_str) if($pid<=0); add_job($app_str,$timeout,$pid); } }