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?
Zombies vermeiden
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Wenn der Prozess sowieso terminiert ist, dann blokiert ``wait()`` nicht (merklich), somit kannst du die Werte der Kindprozesse entgegennehmen...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
@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.
Um Zombies zu vermeiden, musst Du entweder die Rückgabewerte der gestarteten Unterprozesse irgendwie auslesen, oder "init" zum Vaterprozess der gestarteten Prozesse machen.
@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.
Die Alternative ist, "SIGCHLD" abzufangen, und in der Behandlungsfunktion "os.wait()" aufzurufen.
@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.