Wenn Sie versuchen, einen Prozess endgültig zu beenden, welche Option für "kill" sollten Sie verwenden?

26

Ich bekomme eine Menge gemischter Botschaften von Leuten und frage mich, ob es wirklich keinen großen Unterschied gibt, was Sie verwenden.

kill 'x'
killall 'x'
kill -9 'x'

Dies sind einige Optionen, von denen mir bis jetzt gesagt wurde, dass sie verwendet werden sollen, aber einige Leute sagen, dass Kill -9 nur übertrieben ist, Kill an sich nicht funktioniert usw.

Hat jemand einen Rat, welchen man im gängigsten Fall des Abbruchs eines Prozesses (und damit auch seines Zustands) verwenden sollte?

[edit] Ich suche nach einer Möglichkeit, die Ausführung Ihres Prozesses zu stoppen, damit Sie von Anfang an eine neue ausführen können

Chuck Testa
quelle
1
Siehe auch UUK9-Formbrief, der vor Missbrauch warnt SIGKILL.
jw013
1
Um die verschiedenen Signale zusammen mit ihrer Nummer aufzulisten: kill -lund eine Nummer in den entsprechenden Signalnamen zu übersetzen, kill -l 9wird z KILL. B. zurückgegeben .

Antworten:

24

Es gibt eine Reihe von Signalen, deren Standardeinstellung darin besteht, den Prozess zu beenden. Das ultimative Beendigungssignal ist SIGKILL, da es nicht verarbeitet werden kann und der Prozess keine andere Wahl hat, als zu sterben. Dies bedeutet jedoch auch, dass der Prozess, wenn Sie ihn senden, keine Gelegenheit mehr hat, aufzuräumen. Gute Manieren erfordern daher das Senden eines Signals wie SIGTERM, das zuerst verarbeitet werden kann, und nur dann, wenn der Prozess nach einiger Zeit nicht beendet wird. Senden Sie es SIGKILL.

Beachten Sie, dass SIGINT und SIGQUIT keine guten Kandidaten für eine willkürliche Prozessbeendigung sind. Aufgrund der Tatsache, dass sie über die Tastatur des Terminals generiert werden können, werden sie von vielen Anwendungen für spezielle Zwecke verwendet. Beispielsweise generiert der Python-Interpreter mithilfe von SIGINT eine KeyboardInterruptAusnahme (auch in interaktiven Python-Sitzungen, in denen einfach zur Eingabeaufforderung zurückgekehrt wird), und JVM verwendet SIGQUIT, um Stack-Traces zu sichern. SIGINT und SIGQUIT bleiben für die meisten Standard-Befehlszeilendienstprogramme wie findoder wirksam cat.

Während des Herunterfahrens des Systems senden die meisten UNIX- und Linux-Systeme SIGTERM an alle Prozesse, gefolgt von einer Wartezeit von 5 Sekunden, gefolgt von SIGKILL. Dies ist die empfohlene Methode, um einen beliebigen Prozess sicher herunterzufahren.

Beachten Sie außerdem, dass auch SIGKILL einen Prozess möglicherweise nicht beenden kann, der in einer unterbrechungsfreien Wartezeit steckt, bis der Prozess aufwacht.

Adam Zalcman
quelle
1
Hervorragende Antwort. Haben Sie eine Referenz für die kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;Empfehlung?
l0b0
+1 Art der Antwort. Und was ist mit SIGHUP?
Alois Mahdal
2
@AloisMahdal: SIGHUPstammt von dem Tag, an dem Wählleitungen üblich waren. Dieses Signal wurde gesendet, um anzuzeigen, dass die Leitung aufgelegt hat. Später, als das seltener SIGHUPwar, verwendeten Dämonen manchmal, um die Konfigurationsdatei erneut zu lesen, ohne den Prozess neu zu starten. In diesen modernen Zeiten SIGHUPwird selten verwendet. Viele Daemons werden ihre eigene Art der Neuinitialisierung haben (dh, apachectl gracefuloder rndc reconfig. Für Dinge, die Sie nicht verwenden sollten [init.d|smf|upstart|launchd]Kontrollen, wo möglich.
Bahamat
13

Sie sollten mit dem Sanftesten beginnen und von dort aus eskalieren. Das heißt, SIGINT, SIGTERM, SIGQUIT, SIGKILL. Obwohl die meisten Leute SIGINT und SIGQUIT überspringen.

Ignacio Vazquez-Abrams
quelle
Darüber hinaus behandeln einige Anwendungen (wie das JDK) SIGQUIT anders. Ich würde SIGQUIT wahrscheinlich nicht verwenden, ohne zu wissen, wie die jeweilige Anwendung damit umgeht.
dimo414