PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Prozesse, kill und Zombies


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!

nalye
2011-04-28, 20:02:29
Such Dir hier einen Grund aus:
http://knecht-rootrecht.com/bofh.php

;D

Ernsthaft:
'- c' liest aus einem String aus.. Irgendwelche Besonderheiten bei der .sh?

//Edit: Hier gibt´s noch einen Hinweis: http://search.cpan.org/~durist/Proc-ProcessTable-0.40/ProcessTable.pm

Gast
2011-04-28, 21:31:36
Sorry, aber das hilft mir so jetzt nicht weiter. Ich habe auch nicht den Hinweis gefunden!?

Ich muss das aufgerufene Programm beenden, habe aber keine Kontrolle darüber, wie tief Perl die Prozesshierarchie baut und wie ich an darunterliegende Prozesse komme.