Thread Zeitüberwachung für ein Script (8 answers)
Opened by Gast at 2006-07-24 12:29

topeg
 2006-07-25 22:19
#37327 #37327
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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:
Code: (dl )
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. :-)

View full thread Zeitüberwachung für ein Script