Gast
2011-04-28, 18:01:12
Hallo,
ich stehe gerade vollkommen auf dem Schlauch bei einem Perl-Problem.
Vereinfacht habe ich dieses Szenario:
Ein Perl-Skript ruft einen langlebigen Prozess auf (mit IPC :: Open3). Da der Prozess zu langlebig ist, soll er abgeschossen und die Zombies abgeräumt werden.
Nun kommt es zu einer kleinen Perl-Besonderheit: Der Befehl wird nicht direkt so, wie ich ihn an open3() übergebe aufgerufen, sondern mit dem Präfix "sh -c". Dadurch entstehen dann 2 Subprozesse (weiter unten ist ein konkretes Beispiel).
Ich habe jedoch nur eine PID durch den Aufruf von open3() und falls ich diese kille, bleibt der andere Subprozess hängen, ohne dass ich ihn irgendwie beeinflussen könnte.
Ist das irgendwie zu lösen? Oder muss ich ganz anders vorgehen?
Hier das Perl-Skript (sleeper.sh ist ein einfaches Shellskript, das ein "sleep 100" macht)
#!/usr/bin/perl
use strict;
use warnings;
use IPC::Open3;
use POSIX;
my $pid = open3(\*PL_IN, \*PL_OUT, \*PL_ERR, '/bin/bash "sleeper.sh"');
print "Kindprozess: $pid\n";
while(kill(0, $pid)) {
sleep 1;
waitpid(-1, WNOHANG);
}
close(PL_IN);
close(PL_OUT);
close(PL_ERR);
exit 0;
So sehen die Prozesse nach dem Starten aus:
user 4921 31718 0 17:57 pts/0 00:00:00 /usr/bin/perl ./open3.pl
user 4922 4921 0 17:57 pts/0 00:00:00 sh -c /bin/bash "sleeper.sh"
user 4923 4922 0 17:57 pts/0 00:00:00 /bin/bash sleeper.sh
user 4924 4923 0 17:57 pts/0 00:00:00 sleep 100
Und so nach dem Abschiessen der PID 4922 (das ist die PID, die ich von open3 kriege):
user 4923 1 0 17:57 pts/0 00:00:00 /bin/bash sleeper.sh
user 4924 4923 0 17:57 pts/0 00:00:00 sleep 100
Danke für jede Anregung!
ich stehe gerade vollkommen auf dem Schlauch bei einem Perl-Problem.
Vereinfacht habe ich dieses Szenario:
Ein Perl-Skript ruft einen langlebigen Prozess auf (mit IPC :: Open3). Da der Prozess zu langlebig ist, soll er abgeschossen und die Zombies abgeräumt werden.
Nun kommt es zu einer kleinen Perl-Besonderheit: Der Befehl wird nicht direkt so, wie ich ihn an open3() übergebe aufgerufen, sondern mit dem Präfix "sh -c". Dadurch entstehen dann 2 Subprozesse (weiter unten ist ein konkretes Beispiel).
Ich habe jedoch nur eine PID durch den Aufruf von open3() und falls ich diese kille, bleibt der andere Subprozess hängen, ohne dass ich ihn irgendwie beeinflussen könnte.
Ist das irgendwie zu lösen? Oder muss ich ganz anders vorgehen?
Hier das Perl-Skript (sleeper.sh ist ein einfaches Shellskript, das ein "sleep 100" macht)
#!/usr/bin/perl
use strict;
use warnings;
use IPC::Open3;
use POSIX;
my $pid = open3(\*PL_IN, \*PL_OUT, \*PL_ERR, '/bin/bash "sleeper.sh"');
print "Kindprozess: $pid\n";
while(kill(0, $pid)) {
sleep 1;
waitpid(-1, WNOHANG);
}
close(PL_IN);
close(PL_OUT);
close(PL_ERR);
exit 0;
So sehen die Prozesse nach dem Starten aus:
user 4921 31718 0 17:57 pts/0 00:00:00 /usr/bin/perl ./open3.pl
user 4922 4921 0 17:57 pts/0 00:00:00 sh -c /bin/bash "sleeper.sh"
user 4923 4922 0 17:57 pts/0 00:00:00 /bin/bash sleeper.sh
user 4924 4923 0 17:57 pts/0 00:00:00 sleep 100
Und so nach dem Abschiessen der PID 4922 (das ist die PID, die ich von open3 kriege):
user 4923 1 0 17:57 pts/0 00:00:00 /bin/bash sleeper.sh
user 4924 4923 0 17:57 pts/0 00:00:00 sleep 100
Danke für jede Anregung!