Wie kann man sowohl den Prozess als auch den Unterprozess beenden?

9

Ich habe eine Frage gestellt, um zu wissen, wie mehrere Nachrichtenzeilen vom Python-Unterprozessmodul abgerufen werden können.

Das Problem ist, dass ich im Verlauf des Testens den Python-Prozess beenden musste, der den Gnuchess-Prozess ausführt. Die Verwendung von ^ c in der Befehlszeile scheint den Python-Prozess zu beenden, nicht jedoch den Gnuprozess.

Um Gnuchess zu töten, bekomme ich die PID mit ps aux | grep gnuchess und run kill -9 PID . Gibt es andere Methoden, um sowohl den Python- als auch den Gnuchess-Prozess zu beenden?

prosseek
quelle
8
Zufällige Nebenbemerkung: Sie können verwenden pkill, um einen Prozess mit Namen zu beenden , so dass Sie ps aux | grep gnuchessund kill -9 PIDkönnen nurpkill -9 gnuchess
Michael Mrozek

Antworten:

10

Es gibt eine Standardmethode, wenn die Programme zusammenarbeiten. Führen Sie aus, kill -- -42wobei 42 die PID des übergeordneten Prozesses ist. Dies sendet ein Signal an alle Prozesse in der Prozessgruppe, die von Prozess 42 geleitet werden (das Minuszeichen vor der PID bedeutet Prozessgruppe).

Wenn Sie Ihr Python-Skript an einer Shell-Eingabeaufforderung ausführen und es einfach gabelt gnuchess, sollten die beiden Prozesse normalerweise in derselben Prozessgruppe bleiben. Dies scheint jedoch nicht der Fall zu sein, da Ctrl+ an die gesamte Prozessgruppe im Vordergrund Csendet SIGINT.

Gnuchess könnte in einer eigenen Prozessgruppe sein, weil es sich selbst zum Sitzungsleiter gemacht hat (aber ich weiß nicht, warum es das tun würde) oder weil Sie es doppelt gegabelt haben (Python gabelt eine Shell, die Gnuchess gabelt). Eine Doppelgabel ist wahrscheinlich vermeidbar, aber ich kann Ihnen nicht sagen, wie, ohne Ihren Code zu sehen.


Eine einigermaßen zuverlässige und POSIX-konforme Methode zum Ermitteln der PID des gnuchessProzesses ist

gnuchess_pids=$(ps -A -o pid= -o cmd= | awk '$2 ~ /(^|\/)gnuchess$/ {print $1}')

Bestimmte Unix-Varianten haben möglicherweise bessere Möglichkeiten, dies zu erreichen, wie z pgrep.

Gilles 'SO - hör auf böse zu sein'
quelle
0

Versuchen:

pkill <processname>
Dilemma
quelle