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
use strict;
use warnings;
my $x = 1;
my $pid = fork();
while($x == 1)
{
print "$$";
$pid = fork();
if(!defined $pid)
{
die "Could not fork!";
}
elsif($pid == 0)
{
#Hier bin ich im Child-Prozess
#$x++;
#print "Ich bin das Kind: ",$$,"\tx:$x\n";
print "starte Schript\n";
exec("perl test.pl");
}
else
{
#Hier bin ich im Parent-Prozess
#print "ich bin der Vater: ",$$,"\tx:$x\n";
print "Warte auf Child\n";
wait();
}
}
#kill(0, $pid);
QuoteExecution of fork.pl aborted due to compilation errors.
2013-10-25T11:21:49 pqnicht nervös machen lassen, die funktion kill gab es genau so auch schon in 5.8
2013-10-25T11:36:41 Eng1958Ach so Moment ich hatte allerdings die letzte Zeile auch noch auskommentiert:
QuoteAllerdings kommt auch keine andere Fehlermeldung sondern nur:
Global symbol "$pid" requires explicit package name at fork.pl line 30.
fork.pl had compilation errors.
2013-10-25T11:31:49 Eng1958@pq was meinst du mit einmal funktioniert es einmal nicht?
2013-10-25T10:14:34 Eng1958Wenn ich das allerdings drinnen lasse kommt die Fehlermeldung:QuoteExecution of fork.pl aborted due to compilation errors.
2013-10-25T10:55:19 Eng1958Perl 5.8.2 built for aix-thread-multi
perl -c:
fork.pl syntax OK
kill(0, $pid);
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
local $SIG{CHLD} = 'IGNORE'; my $x = 1; while ($x == 1) { if ($pid = fork){ while($x == 1) { print "$$"; if (kill 0 => $pid) { print "child is alive...\n"; } else { print "child is dead...\n"; last; } sleep 1; } print "ende des ganzen\n"; } elsif(defined $pid){ # $pid ist hier null falls definiert # hier gibt es den child prozess # pid des parent über getppid verfügbar print "Kindprozess...\n"; exec("perl test.pl"); print "Verlasse jetzt Kindprozess\n"; } }
2013-10-25T12:53:33 Eng1958Allerdings verstehe ich immer noch nicht wie ich jetzt beide gleichzeitig beenden kann.
2013-10-25T13:07:26 Eng1958Das ganze wird dann mit dem Shell Befehl: "kill -15 <ParentID>" abgeschossen.
2013-10-25T13:25:03 Eng1958Du hattest doch nach der Bedingung gefragt, das ist für mich die Bedingung.
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
if(@ARGV != 1) { print "$CMD usage: ScriptDaemon.pl Script \n"; exit 0; } my $scriptname = $ARGV[0]; local $SIG{CHLD} = 'IGNORE'; local $SIG{TERM} = 'schliessen'; while (1) { if ($pid = fork) { #Hier ist der Parent prozeß print "Parentprozess\n"; while(1) { print "$$"; if (kill 0 => $pid) { print "child is alive...\n"; } else { print "child is dead...\n"; last; } sleep 1; } print "ende des ganzen\n"; } elsif(defined $pid) { # $pid ist hier null falls definiert # hier gibt es den child prozess # pid des parent über getppid verfügbar print "Kindprozess...\n"; exec($scriptname); print "Verlasse jetzt Kindprozess\n"; } } sub schliessen { my $befehl = "kill -15 $pid"; my $result = `$befehl`; print "Beenden"; exit 0; }
2013-10-25T13:48:39 Eng1958Code (perl): (dl )local $SIG{TERM} = 'schliessen';
local $SIG{TERM} = 'schliessen';
1 2 3 4 5 6
$SIG{TERM} = sub { my $befehl = "kill -15 $pid"; my $result = `$befehl`; print "Beenden"; exit 0; };