Seite 1 von 1

Zombies vermeiden

Verfasst: Dienstag 11. Januar 2011, 18:51
von rhersel
Mein Python Programm erzeugt Zombies durch den Aufruf von suprocess.Popen() ohne .wait() weil ich nicht auf das Ende des Subprozesses warten kann. Da das Programm sehr lange läuft (theoretisch unendlich lange), werden die Zombies irgendwann einmal zum Problem (keine freien PIDs mehr da). Wie kann ich die Zombies im Programm killen?

Der Aufruf von subprocess.terminate() oder subprocess.kill() nachdem der Subprozess definitiv fertig ist (und zum Zombie wurde), funktioniert leider nicht. Auch nach dem subprocess.kill() existiert der Zombie immer noch. Wie werde ich die Biester los?

Re: Zombies vermeiden

Verfasst: Dienstag 11. Januar 2011, 19:16
von Leonidas
Wenn der Prozess sowieso terminiert ist, dann blokiert ``wait()`` nicht (merklich), somit kannst du die Werte der Kindprozesse entgegennehmen...

Re: Zombies vermeiden

Verfasst: Dienstag 11. Januar 2011, 19:47
von lunar
@rhersel: Zombies sind bereits beendete Prozesse, bei denen lediglich der Rückgabewert nicht durch den Vaterprozess ausgelesen wurde. Folglich kannst Du mit "terminate()" und "kill()" gar nichts ausrichten, denn einen beendeten Prozess kann man nicht "noch mehr" beenden. Deswegen heißen Zombies ja so.

Um Zombies zu vermeiden, musst Du entweder die Rückgabewerte der gestarteten Unterprozesse irgendwie auslesen, oder "init" zum Vaterprozess der gestarteten Prozesse machen.

Re: Zombies vermeiden

Verfasst: Mittwoch 12. Januar 2011, 10:27
von rhersel
Ich kann nicht wait() verwenden, weilt die Subprozesse a, b, und c gleichzeitig loslaufen müssen und nicht einer nach dem anderen.

Wie kann ich denn die Rückgabewerte der gestarteten Unterprozesse auslesen?

Re: Zombies vermeiden

Verfasst: Mittwoch 12. Januar 2011, 10:34
von lunar
@rhersel: Ist das nicht offensichtlich? Du legst die erzeugten "Popen"-Objekte einfach irgendwo in einer Liste ab, und gehst diese periodisch oder an zentraler Stelle durch, um mittels ".poll()" zu prüfen, ob der Prozess noch lebt. Falls nicht, liest das auch gleichzeitig den Rückgabewert aus, und Du kannst den toten Prozess guten Gewissens entfernen.

Die Alternative ist, "SIGCHLD" abzufangen, und in der Behandlungsfunktion "os.wait()" aufzurufen.

Re: Zombies vermeiden

Verfasst: Mittwoch 12. Januar 2011, 10:38
von BlackJack
@rhersel: Die Rückgabewerte bekommt man mit `wait()`. Du sollst ja auch nicht Prozess `a` starten und dann darauf waren, und dann Prozess `b` starten und..., sondern `a`, `b`, und `c` starten und *dann* `wait()` verwenden. Irgendwo in Deinem Programm hast Du doch mal versucht `kill()` und `terminate()` auf Zombies anzuwenden -- an *der* Stelle wirst Du die mit `wait()` los.

Re: Zombies vermeiden

Verfasst: Mittwoch 12. Januar 2011, 17:32
von rhersel
Vielen Dank.

Das mit dem subprocess.poll() habe ich ausprobiert und es funktioniert prima.

Die wait() Variante finde ich noch besser; muss ich mal testen.