Wie kann man einen Prozessbaum unter Linux töten? [geschlossen]

14

In einigen Fällen wird beim Senden eines SIGTERM an einen Prozess SIGTERM an alle untergeordneten Prozesse gesendet. Manchmal funktioniert dies jedoch nicht.

Gibt es einen Befehl oder ein Dienstprogramm, mit dem ich einen Prozess und alle untergeordneten Prozesse gleichzeitig beenden kann? Normalerweise sammle ich alle Pids manuell zu einem Kill-Befehl, aber das fühlt sich dumm an.

In dieser SO-Frage wird gefragt, wie dies mit Perl geschehen soll, aber alles, was die Arbeit erledigt, wäre großartig.

itsadok
quelle
Sieht pkill -9mächtiger aus als pkill, aus welchem ​​Grund auch immer.
Andrew

Antworten:

13

Angenommen, die Prozesse haben eine Sitzungskennung gemeinsam (die sie verwenden sollten, sofern sie nicht ausdrücklich setsid () aufgerufen haben), können Sie sie mit pkill durch eine Sitzung 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 tue:

pkill -9 -s 12804

Dann stirbt alles auf einen Schlag.

Sie können auf ähnliche Weise nach Prozessgruppen töten, obwohl dies für viele Kinder, die sich alle eine Ebene unter einem übergeordneten Element befinden, sinnvoller ist, als für eine Kette von zugeordneten Prozessen.

James F
quelle
2

Normalerweise sollte ein antwortender Client ein sigterm erhalten und sich selbst ausschalten, wodurch alle seine untergeordneten Prozesse beendet werden. Wenn der Client andererseits nicht antwortet, wird ein normales Beendigungssignal wahrscheinlich keine Antwort hervorrufen.

Dann senden Sie einen SIGKILL, der das System selbst anweist, den Prozess jetzt zu stoppen. Dies ist in den meisten Fällen möglich, es sei denn, der Prozess befindet sich in einem unterbrechungsfreien Ruhezustand, z. B. wenn auf eine E / A gewartet wird eingang oder ähnliches.

In diesem Fall wird sogar der SIGKILL am Ende nichts mit dem Prozess anfangen. Der untergeordnete Prozess wird wahrscheinlich in einem ähnlichen Stadium der Verzögerung sein.

Es gibt einen Grenzfall, in dem der übergeordnete Prozess möglicherweise ordnungsgemäß beendet wird, der untergeordnete Prozess jedoch nicht beendet werden kann. Dann werden Sie mit einem Zombie-Prozess enden, der nicht bereinigt werden kann, da sein Vater weg ist, aber auf nichts reagiert. Der einzige Weg, diese zu beseitigen, ist ein Neustart. In den meisten Fällen sind sie jedoch ziemlich harmlos, da sie lediglich eine PID aufnehmen, während die von ihnen verwendete Steckdose bereits verblasst ist.

towo
quelle
2

Wenn ich den Prozessbaum von Firefox beenden möchte, ist es möglich, ihn mit dem obigen Befehl "pkill -9 -s firefox" zu beenden.


quelle