Was ist der Zweck der Option -9 im Befehl kill?

Antworten:

28

Die Ubuntu-Manpage für killerklärt den Zweck des -9Schalters (zugegebenermaßen ziemlich abgehackt):

Name     Num   Action    Description
KILL       9   exit      cannot be blocked

Hier ist, was eine andere Manpage sagt.

Der Befehl killsendet das angegebene Signal an den angegebenen Prozess oder die angegebene Prozessgruppe. Wenn kein Signal angegeben ist, wird das TERMSignal gesendet. Das TERMSignal bricht Prozesse ab, die dieses Signal nicht erfassen. Für andere Prozesse muss möglicherweise das Signal KILL( 9) verwendet werden, da dieses Signal nicht abgefangen werden kann.


Die Verwendung des -9Schalters stellt daher sicher, dass der Prozess effektiv beendet wird. Auch wenn ein eingefrorener oder nicht reagierender Prozess möglicherweise nicht auf ein einfaches TERM Signal reagiert, stirbt er, wenn ein KILLSignal gesendet wird.

SirCharlo
quelle
40

Der kill- Befehl sendet ein definiertes Signal an einen Prozess mit einer bestimmten Identität (PID):

kill -<signal> <pid>

Natürlich können wir nur Prozesse beenden, die wir besitzen, während root alle Prozesse beenden kann. In Wikipedia finden Sie eine schöne Zusammenfassung der Rechensignale.

Signale kill, die gesendet werden können, werden in der Manpage aufgelistet . Das Signal kann durch Name oder durch Nummer dargestellt werden. Wenn kein Signal gegeben wird, wird das Standard-Signal 15 resp. TERMwird genutzt.

Alle drei folgenden Befehle sind daher identisch:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

Der Unterschied zwischen SIGTERMund SIGKILLbesteht darin, wie eine Anwendung auf das Signal reagieren kann:

  • TERM: Eine Anwendung kann beendet werden, dh eine Shutdown-Routine ordnungsgemäß ausführen.
  • KILL: Die Anwendung wird sofort gestoppt und beendet (was in einigen Fällen zu Datenverlust oder einer Erhöhung des Apports führen kann, um einen vermuteten Absturz zu melden).
Takkat
quelle
16

Beachten Sie, dass alle der folgenden synonym sind:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

Es ist erwähnenswert, dass SIGKILL in der Welt der Signalverarbeitung eine der wenigen einzigartigen Funktionen ist, die vom Betriebssystem und nicht vom Programm ausgeführt werden. Wenn Sie ausführen kill -9, teilen Sie der Anwendung nicht mit, dass sie sich selbst beenden soll, sondern dass das Betriebssystem die Ausführung des Programms beenden soll, unabhängig davon, was das Programm gerade ausführt.

Nach dem Senden von SIGKILL wird das Programm sofort gestoppt. Wenn im Namen des Programms Kernel-Aufrufe ausgeführt werden (z. B. File IO), werden diese Aufrufe je nach Aufruf möglicherweise erst fortgesetzt, wenn sie beendet sind. Das Programm selbst wird jedoch nicht mehr ausgeführt. Beachten Sie, dass sich verfolgte Tasks oder Tasks, die unter einem Debugger ausgeführt werden, hier möglicherweise anders verhalten.

Das andere Signal, das nicht blockiert werden kann, ist SIGSTOP, das einen ähnlichen Effekt hat, aber stattdessen das Programm einfriert . Sie können SIGCONT später senden , um es fortzusetzen . Dieses Verhalten wird vollständig vom Betriebssystem gesteuert und das Programm erhält keine vorherige Benachrichtigung.

Alle anderen Signale werden an das Programm gesendet. es kann sie behandeln, wie es will, oder wenn es das Signal ignoriert, wird ein Standardverhalten befolgt.

Hier sind einige nützliche Signale, die Sie möglicherweise an einen Prozess senden:

  • SIGHUP - Auflegen Zeigt
    dem Programm an, dass der Benutzer die Verbindung getrennt hat (z. B. SSH-Sitzung oder Terminalfenster wurde geschlossen).
    Normalerweise wird das Programm ordnungsgemäß heruntergefahren.
  • SIGINT - Interrupt Wird
    gesendet, wenn Sie CTRL+ C
    drücken. Bedeutet normalerweise "Stop was Sie tun" - kann das Programm beenden oder nicht
  • SIGTERM - terminate
    Die Standardeinstellung, die von killund gesendet wird killall.
    Beendet normalerweise das Programm ... manchmal, nachdem das Programm beendet ist, was auch immer es tut.
  • SIGSTOP - Stop Wird
    gesendet, wenn Sie CTRL+ Z
    drücken. Unterbricht das oben beschriebene Programm
  • SIGPIPE - Pipe geschlossen Zeigt
    dem Programm an, dass die Pipeline geschlossen wurde. Beendet normalerweise das Programm.
    Zum Beispiel cat /etc/passwd | head -n1wird SIGPIPE an den catProzess gesendet, nachdem die erste Zeile gedruckt wurde, und wird catbeendet, bevor die gesamte Datei fertiggestellt ist.

Während alle diese Signale "natürlich" in ihrer eigenen Einstellung auftreten, können Sie das Signal verwenden, um eine Bedingung vorzutäuschen, um das gewünschte Ergebnis zu erzielen.

Wenn Sie beispielsweise die SSH-Sitzung einer anderen Person beenden möchten, können Sie den Prozess einfach beenden. Auf diese Weise verhindern Sie jedoch, dass die HISTORY-Datei aktualisiert wird, was aus Sicherheitsgründen wichtig sein kann. Wenn Sie es jedoch SIGHUP senden, geht der Prozess davon aus, dass die Verbindung unterbrochen wurde , und führt die Standardbereinigung durch.

tylerl
quelle
Strg + \ Sends SIGQUIT, wobei die Standardaktion darin besteht, den Core zu sichern und zu beenden. Dies kann verwendet werden, wenn ein Programm etwas sehr Falsches tut, Sie es sofort stoppen müssen und es später debuggen möchten.
Simon Richter
@ SimonRichter Oh, du hast recht. Fest.
Tyler
6

kill -9 Bedeutung: Der Prozess wird vom Kernel abgebrochen. Dieses Signal kann nicht ignoriert werden. 9 bedeutet KILL-Signal, das nicht abgefangen oder ignoriert werden kann

Verwendung: SIGKILL Singal

Töten Bedeutung: Der Tötungsbefehl ohne Signal übergibt das Signal 15, wodurch der Vorgang auf normale Weise beendet wird.

Verwendung: SIGTERM- Signal, das von Programmierern verarbeitet werden kann

devav2
quelle