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

topeg
 2006-07-25 00:34
#37324 #37324
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
das Ding ist aus dem stehgreif und unerprobt. Es soll dir nur einen Anhalt/Basis bieten wie es gehen könnte:
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
#!/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("",<FIFO>);
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);
}
}

Wenn das Programm startet wird eine datei (fifo) angelet in die man die zu starten/beobachtenden wünscht. Das Format ist "<Prozessid>:<Timeout in Sekunden>:<Konandozeilenaufruf des Programmes>"
Wenn eine Prozessi< kleinergelich 0 übergeben wird startet das Script das Programm mit dem letzten übergeben Argument selber.

View full thread Zeitüberwachung für ein Script