Das Script war auch nur als Anregung gedacht und steckte voller Fehler, ich hatte es hier im Editorfenster kurz zuammengetippt, ohne es zu testen.
Hier ist eine funktionsfähige Version:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/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)=@_;
print "$0: Job hinzugefügt: \"$app_str\" PID=$pid, Timeout=$timeout\n";
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 && $job->{running}>0)
{
my $ps=`ps -o "%c" --no-headers -p $job->{pid}`;
chomp($ps);
print "PS: $ps\n";
if( $ps eq $job->{app})
{
print "$0: \"$job->{app}\" läuft noch nach $job->{timeout} Sekunden.\n";
}
else
{
print "$0: \"$job->{app}\" wurde vorzeitzig beendet.\n";
}
kill_job($job->{pid});
}
}
}
### 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";
}
}
# Eingaben lesen
while(1)
{
my $time=time();
my $in="";
eval
{
local $SIG{ALRM} = sub { die };
# timeout Zyklus setzen
alarm($conf{timerstep});
eval
{
sysopen(FIFO, $conf{fifo}, O_RDONLY) or die "kann $conf{fifo} nicht lesen ($!)\n";
$in=join("",<FIFO>);
chomp($in);
close FIFO;
};
# timeout aus.
alarm(0);
};
exit(0) if($in=~/^exit\s*$/s);
print "IN: $in\n" if($in ne "");
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);
}
&test_jobs() if( $time+$conf{timerstep} <= time() );
}
Was die funktion übers netzwerk betrifft log dich über ssh ein und benutze das script darüber. Ansonsten müßte ich einen Client und Server schreiben, mit allem was dazugehört wie login, authentifikation usw. Aber niemand hindert dich daran es selber zu schreiben. :-)