Sicherstellen, dass Subprozesse beim Beenden des Python-Programms beendet werden
Ist es ein Weg, um sicherzustellen, dass alle erstellten Teilprozess sind die Toten an der Ausfahrt Zeit ein Python-Programm? Anhand des teilprozesses " meine ich diejenigen erstellt mit subprocess.Popen().
Wenn nicht, sollte ich iterieren über alle der ausstellenden tötet und tötet -9? alles Reiniger?
Kommentar zu dem Problem
InformationsquelleAutor der Frage pupeno | 2008-11-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie atexit für diese, und registrieren Sie alle clean-up-Aufgaben werden ausgeführt, wenn das Programm beendet wird.
atexit.register(func[, *args[, **kargs]])
In Ihrem cleanup-Prozess, Sie können auch schreiben Sie Ihre eigenen warten, und töten Sie es, wenn Sie Ihre gewünschte timeout Auftritt.
Hinweis -- zugewiesenen Funktionen werden nicht ausgeführt, wenn dieser Prozeß (parent process) ist getötet.
Die folgenden windows-Methode ist nicht mehr erforderlich, für python >= 2.6
Hier ist ein Weg, um zu töten, einen Prozess in windows. Ihre Popen Objekt hat einen pid-Attribut, so können Sie einfach rufen, indem Erfolg = win_kill(p.pid) (Muss pywin32 installiert):
InformationsquelleAutor der Antwort monkut
Unter *nix ist, vielleicht mit Hilfe von Prozess-Gruppen kann helfen, Sie aus - Sie fangen können Unterprozesse erzeugt durch Ihre Teilprozesse als auch.
Andere überlegung ist, eskalieren die Signale: von SIGTERM (default-signal für
kill
) SIGKILL (ein.k.einkill -9
). Warten Sie eine kurze Zeit zwischen den Signalen zu geben, der Prozess eine chance, exit sauber, bevor Siekill -9
.InformationsquelleAutor der Antwort orip
Den
subprocess.Popen.wait()
ist der einzige Weg, um sicherzustellen, dass Sie tot sind. In der Tat, POSIX-Betriebssysteme erfordern, dass Sie warten auf Ihre Kinder. Viele *nix-s erstellen Sie einen "zombie" - Prozess: ein Totes Kind, für das die Eltern nicht warten.Wenn das Kind halbwegs gut geschrieben ist, bricht er ab. Oft werden die Kinder Lesen aus der PIPE. Schließen Sie den Eingang, einen großen Hinweis auf das Kind, dass es sollte den laden schließen und beenden.
Wenn das Kind Fehler macht und Sie nicht kündigen, müssen Sie möglicherweise um es zu töten. Sie sollten diesen Fehler beheben kann.
Wenn das Kind ein "dienen-forever" - Schleife, und ist nicht dazu konzipiert, zu kündigen, sollten Sie entweder töten oder eine Eingabe oder Nachricht, die Kraft es zu beenden.
Bearbeiten.
In standard-Betriebssystemen, haben Sie
os.kill( PID, 9 )
. Kill -9 ist hart, BTW. Wenn Sie töten kann mit SIGABRT (6?) oder SIGTERM (15) das ist höflicher.Im Windows-Betriebssystem, die Sie nicht haben eine
os.kill
funktioniert. Blick auf diese ActiveState Rezept für die Kündigung einen Prozess in Windows.Wir haben die Kind-Prozesse, die WSGI-Server. Um Sie zu beenden machen wir eine BEKOMMEN auf eine spezielle URL; dadurch wird das Kind zum Aufräumen und beenden.
InformationsquelleAutor der Antwort S.Lott
InformationsquelleAutor der Antwort Igal Serban
Achtung: Linux-only! Sie können Ihr Kind erhalten ein signal, wenn dessen Elternteil stirbt.
Ersten install python-prctl==1.5.0, dann ändern Sie Ihren Eltern-code, starten Sie Ihre Kind-Prozesse wie folgt
Was dieser sagt, ist:
wenn meine Eltern beendet".
InformationsquelleAutor der Antwort Carl D'Halluin
orip Antwort ist hilfreich, hat aber den Nachteil, dass es tötet den Prozess und gibt einen Fehler-code Ihrer Eltern. Ich vermied es, wie dieser:
Dann:
Natürlich können Sie tun dies mit try/except/finally-aber Sie haben, um die außergewöhnliche und außergewöhnlichen Fällen GESONDERT.
InformationsquelleAutor der Antwort Malcolm Handley
Könnten Sie verletzen Kapselung und test, dass alle Popen Prozesse beendet haben, indem Sie tun,
Können Sie nicht sicherstellen, dass alle Teilprozesse sind tot ohne aus und töteten jeden überlebenden. Aber wenn Sie dieses problem haben, ist es wahrscheinlich, weil Sie eine tiefere design-problem.
InformationsquelleAutor der Antwort ddaa
Brauchte ich eine kleine variation dieses problem (Reinigung Teilprozesse, aber ohne das Python-Programm selbst), und da es hier nicht erwähnt zu den anderen Antworten:
setsid
läuft das Programm in einer neuen Sitzung, somit die Zuweisung einer neuen Prozessgruppe und seine Kinder. Aufrufos.killpg
auf es so nicht bringen Sie Ihre eigenen python-Prozess auch.InformationsquelleAutor der Antwort berdario
Eine Lösung für windows werden kann, verwenden Sie die win32-job-api z.B. Wie kann ich automatisch zerstören Kind Prozesse in Windows?
Hier ist eine vorhandene python-Implementierung
https://gist.github.com/ubershmekel/119697afba2eaecc6330
InformationsquelleAutor der Antwort ubershmekel
Ich tatsächlich benötigt, um dies zu tun, aber es beteiligt die Ausführung von remote-Befehlen. Wir wollten in der Lage zu stoppen die Prozesse, die durch das schließen der Verbindung zum server. Auch, wenn Sie zum Beispiel in der python-repl, können Sie wählen, zu laufen den Vordergrund, wenn Sie möchten in der Lage sein, verwenden Sie Strg-C zum beenden.
Dank Malcolm Handley für den ersten Entwurf. Fertig mit python2.7 auf linux.
InformationsquelleAutor der Antwort matanmarkind
Dies ist, was ich für meinen posix-app:
Wenn Ihre app vorhanden ist, rufen Sie die kill () - Methode dieser Klasse:
http://www.pixelbeat.org/libs/subProcess.py
Beispiel hier benutzen:
http://code.google.com/p/fslint/source/browse/trunk/fslint-gui#608
InformationsquelleAutor der Antwort pixelbeat
Hilfe für python-code:
http://docs.python.org/dev/library/subprocess.html#subprocess.Popen.wait
InformationsquelleAutor der Antwort st4rtx
Finden Sie heraus, eine Lösung für linux (ohne Installation prctl):
InformationsquelleAutor der Antwort Patrick