Wir verwenden einen Python-Prozess, um lange laufende Python-Subprozesse zu verwalten. Teilprozesse müssen gelegentlich getötet werden. Der Befehl kill bringt den Prozess nicht vollständig zum Erliegen, er macht ihn nur ungültig.Subprozesse in Python sauber löschen
Das Ausführen des folgenden Skripts veranschaulicht dieses Verhalten.
import subprocess
p = subprocess.Popen(['sleep', '400'], stdout=subprocess.PIPE, shell=False)
oder
p = subprocess.Popen('sleep 400', stdout=subprocess.PIPE, shell=True)
Wird eine subprocess erstellen.
p.terminate()
p.kill()
tut nichts zu dem Prozess. Demonstriert von ps aux | grep sleep
$ ps aux| grep 'sleep'
User 8062 0.0 0.0 7292 764 pts/7 S 14:53 0:00 sleep 400
Der Prozess getötet wurde nicht/gemacht verstorben. Wenn Sie die Funktion subprocess.call()
mit 'kill'
und pid
als Argumente verwenden, wird der Befehl kill ausgegeben.
subprocess.call(['kill', str(p.pid)])
Dies wird den Prozess beenden, aber es ist jetzt nicht mehr gültig.
$ ps aux | grep 'sleep'
User 8062 0.0 0.0 0 0 pts/7 Z+ 14:51 0:00 [sleep] <defunct>
Wenn die Warteschlange läuft lange genug wird es schließlich seine maximale Anzahl von Prozessen erreichen, oder wird es schließlich die nicht mehr existierenden Prozesse ernten und in Ordnung sein?
Wenn die Antwort die erstere ist, wie kann ich mit defekten Prozessen in Python umgehen, ohne den übergeordneten Prozess zu töten?
Gibt es eine bessere Möglichkeit, Prozesse zu töten?
'kill' sendet nur ein" Signal "an den Prozess und fordert sie auf, es zu beenden. Wenn Sie es jedoch mit "-9" "töten", wird es vom Betriebssystem gelöscht. Aber das ist eine schlechte Möglichkeit, einen Prozess zu beenden. –
'kill -9' macht dasselbe wie die' subprocess.kill() 'Funktion. Ob ich versuche, es sauber mit 'p.terminate()' zu beenden oder es mit 'p.kill()' zu beenden, es endet immer noch als Zombie-Prozess. – user7495615