
Manchmal führt das Senden eines SIGTERM an einen Prozess dazu, dass dieser SIGTERM an alle seine untergeordneten Prozesse sendet. Manchmal funktioniert dies jedoch nicht.
Gibt es einen Befehl oder ein Dienstprogramm, mit dem ich einen Prozess und alle seine untergeordneten Prozesse gleichzeitig beenden kann? Normalerweise greife ich darauf zurück, alle PIDs manuell in einem Kill-Befehl zu sammeln, aber das kommt mir dumm vor.
Diese SO-Fragefragt, wie das mit Perl geht, aber alles, was die Arbeit erledigt, wäre großartig.
Antwort1
DasSO-Fragedeckt dies ab.
Antwort2
Vorausgesetzt, die Prozesse teilen sich eine Sitzungskennung (was sie sollten, sofern sie nicht explizit setsid() aufgerufen haben), können Sie sie mit pkill sitzungsweise beenden:
user@machine:~> ps -o pid,sess,cmd -U user
PID SESS CMD
12804 12804 -bash
12916 12804 ps -o pid,sess,cmd -U user
user@machine:~> sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ ps -o pid,sess,cmd -U user
PID SESS CMD
12804 12804 -bash
12920 12804 sh
12921 12804 sh
12922 12804 sh
12924 12804 sh
12926 12804 sh
12928 12804 sh
12937 12804 ps -o pid,sess,cmd -U user
sh-3.00$
Wenn ich von einem anderen Terminal aus Folgendes mache:
pkill -9 -s 12804
Dann stirbt alles auf einen Schlag.
Sie können die Beendigung auch nach Prozessgruppen durchführen. Dies ist jedoch eher für viele untergeordnete Prozesse sinnvoll, die sich alle eine Ebene unter einem übergeordneten Prozess befinden und nicht für eine Kette verknüpfter Prozesse.
Antwort3
Normalerweise sollte ein antwortender Client ein Sigterm erhalten und sich selbst beenden, wodurch alle seine gegabelten Kindprozesse beendet werden. Wenn der Client hingegen nicht antwortet, wird ein normales Beendigungssignal wahrscheinlich keine Antwort hervorrufen.
Sie senden dann ein SIGKILL, das dem System selbst mitteilt, dass der Prozess jetzt gestoppt werden soll. Dies kann es in den meisten Fällen tun, außer wenn sich der Prozess in einem Zustand ununterbrochenen Ruhezustands befindet, z. B. während er auf eine E/A-Eingabe oder Ähnliches wartet.
In diesem Fall bewirkt selbst SIGKILL letztlich nichts bei dem Prozess; der untergeordnete Prozess wird sich wahrscheinlich in einem ähnlichen Zustand der Verzögerung befinden.
Es gibt einen Grenzfall, in dem der übergeordnete Prozess zwar problemlos beendet werden kann, der untergeordnete Prozess jedoch nicht beendet werden kann. Dann haben Sie am Ende einen Zombie-Prozess, der nicht bereinigt werden kann, da sein übergeordneter Prozess nicht mehr existiert, aber auf nichts reagiert. Die einzige Möglichkeit, diese Prozesse loszuwerden, ist ein Neustart. In den meisten Fällen sind sie jedoch ziemlich harmlos, da sie lediglich eine PID belegen, während der Socket, den sie verwenden wollten, bereits verschwunden ist.
Antwort4
Wenn ich den Prozessbaum von Firefox beenden möchte, ist es dann möglich, ihn mit dem obigen Befehl „pkill -9 -s firefox“ zu beenden?