Wie Linux-Signale funktionieren: UNTERSCHRIFT, SIGTERM und SIGKILL

Inhalt

Gefahrensymbol

Software-Interrupts auf Linux- und Unix-Systemen erfolgen durch Signale. Es gibt viele verschiedene Linux-Signale, aber einige sind hervorgehoben und es ist wichtig, sie zu verstehen und zu kennen: UNTERSCHRIFT, SIGTERM und SIGKILL. So funktionieren sie.

Was ist ein Linux-Signal?

Wir alle verstehen, dass eine rote Ampel bedeutet, dass wir aufhören müssen zu laufen oder zu fahren. Äquivalent, auf Linux- und Unix-Systemen, ein Signal kann an ein laufendes Programm oder einen laufenden Dienst übergeben werden, um damit zu interagieren. Als Beispiel, man könnte ein rotes Lichtsignal an ein Programm senden, indem man einfach a aussendet SIGTERM Unterschrift.

Wie bei Rotlicht, Menschen können sich entscheiden, weiter zu gehen oder zu fahren, wenn die Ampel rot ist. Auch wenn es für alle Beteiligten keine sichere Idee ist, ein SIGTERM das Signalisieren einer Prozedur wird genau das tun; Der Ablauf / Programm kann dieses Signal ignorieren.

Alle grundlegenden Linux-Signale haben eine Nummer (1-30 +). Nach einer Weile, ein allgemein geübter Linux-Benutzer wird eines oder mehrere davon kennen. Als Beispiel, das SIGTERM das Signal stimmt mit der Zahl überein 15 und das Signal 9 (SIGKILL) ist wohl das bekannteste, da sie es ermöglicht, ein Verfahren gewaltsam zu beenden, im Gegensatz zu unserem SIGTERM Beispiel für Rotlicht.

htop mögliche Programmsignale anzeigen

Hier sehen wir den Hauptbildschirm von htop (Sie können dieses praktische Dienstprogramm installieren, indem Sie eingeben sudo apt install htop unter Ubuntu / Minze, Ö sudo yum install htop in RedHat / Centos / Fedora) mit einer Reihe von Terminierungssignalen und anderen (weiter unten in der Liste; es gibt 37 gesamt) die rechts an ein zuvor ausgewähltes Verfahren gesendet werden können. Man kann ein Verfahren auswählen, indem man den Cursor nach oben drückt / runter und dann ein Signal mit F9 . senden.

SIGKILL & SIGTERM

Auch wenn der Name etwas unheimlich klingen mag, Der gebräuchliche Linux-Jargon für die Prozessbeendigung ist, dass man “Strauch” Eine Prozedur. Allgemein gesagt, wir wollen eine Prozedur nur mit a beenden -9 (SIGKILL) signalisieren, wenn besagtes Verfahren / Programm ist gesperrt. Denken Sie daran, dass jedes Mal, wenn wir über Verfahren oder Programme sprechen, Worte können nach Belieben ausgetauscht werden. Einfach, eine Prozedur ist jedes Programm (oder dienst) Laufen, das gegeben wurde a PID (eine Verfahrenskennung).

Sehen wir uns ein Beispiel an, wie Sie eine laufende Hintergrundprozedur über a . beenden SIGKILL Signal zum laufenden Vorgang. Beachten Sie, dass, wie erklärt SIGKILL es ist ziemlich destruktiv und beendet die Prozedur, egal was die Prozedur mit dem Signal machen will. Das Verfahren kann mehrere Signale erfassen und umleiten, während andere es nicht tun.

SIGKILL an einen im Hintergrund laufenden Schlafprozess senden

Hier starten wir a sleep 1800 im Hintergrund (mit & am Ende des Befehls), das fing als erstes an ([1]) Hintergrundverfahren mit PID 574660. Anschließend, Wir töten diese Hintergrundprozedur mit kill -9 574660, Wo ist er -9 Es repräsentiert SIGKILL.

Obwohl das Verfahren sofort endet, Wir sehen die Abschlussmeldung nicht (Hintergrundverfahren 1 ermordet, Mit anderen Worten, [1]+ Killed) wenn die Eingabeaufforderung zurückkehrt, bevor die Nachricht angezeigt wird, Mit anderen Worten, Das Zurückgeben der Befehlszeile war eine schnellere Operation als der Abschluss der Prozedur oder gleichwertiges.

Wir überprüfen die Liste der Prozesse, indem wir nach der PID greifen ps -ef | grep 574660. Auch wenn es vielleicht einen Ausweg gibt, die gezeigte Ausgabe ist nur für unsere Ausführung grep Befehl; das sleep Das Verfahren ist bereits abgeschlossen.

Bewerten wir das gleiche mit SIGTERM, Mit anderen Worten kill -15 ${PID} wo ${PID} ist das Verfahren, das wir beenden wollen.

SIGTERM an einen im Hintergrund laufenden Schlafprozess senden

Wir mussten die Eingabetaste drücken, um zu aktivieren / Abschlussmeldung anzeigen (wie vorher erklärt). Wir können sehen, dass das Programm wieder korrekt beendet wurde. Trotz dieses, diesmal, auch wenn es für dieses spezielle Beispiel unsichtbar ist (weiter lesen!), Intern innerhalb der sleep Programmcode, die dinge waren ein bisschen anders.

Für diesen Fall (mit -15 Mit anderen Worten SIGTERM um den Vorgang abzuschließen), das sleep Das Verfahren wurde benachrichtigt und hatte die Möglichkeit, das Signal intern zu bearbeiten. Anschließend, könnte mit Selbstbeendigung reagieren, Ignorieren des Signals oder durch eine andere im Code entwickelte Aktion. Darüber hinaus können wir dies beweisen, indem wir das Ausgangssignal überprüfen und / oder der Ausgang:

Der Unterschied zwischen den Ausgangs- und Ausgangscodes gemäß dem gesendeten Signal

Hier starten wir die Prozedur sleep 2000 zweimal, und dann eine andere Shell-Sitzung verwendet / Terminal zum Beenden des Programms. Das erste Mal verwenden wir kill -9 und das zweite mal benutzen wir kill -15 um das zu stoppen sleep Prozess.

Wir merken sofort, wie der Ausgang zurückkehrt. Killed in der ersten (kill -9 Handlung) Beispiel. Für den zweiten Versuch (mit kill -15), Wir sehen den Ausgang Terminated Anstatt von; das Programm wurde automatisch beendet. Nach den jeweiligen Kündigungen, Wir haben auch die Ausgabesignale überprüft und festgestellt, dass die Ausgabecodes unterschiedlich waren.

Warum ist das wichtig? Ziehen Sie größere Programme in Betracht; unter diesen Umständen, Wir waren gerade dabei, ein einfaches zu beenden sleep Befehl. Es wurden keine Daten verarbeitet, kein Verkehr wurde hin und her gesendet, etc. Aber, Was ist, wenn wir eine senden? kill -9 Befehl an unseren Datenbankserver (Dies, in der Regel, würde Root-Level-Privilegien erfordern / sudo)?

Ich würde die Datenbank aufwecken, um beim nächsten Start in den Crash-Recovery-Modus zu wechseln, weil, soweit die Datenbanksoftware weiß, Alles, was geschah, war “war da” gefolgt von “irgendein”. Mit anderen Worten, es ist abgestürzt. Wenn wir stattdessen a . ausgegeben hätten kill -15 , die Datenbanksoftware hat möglicherweise einen kontrollierten Shutdown durchgeführt, als Beispiel, zuerst die Verbindung neuer Benutzer blockieren, dann trennen / Bestehende Benutzer kündigen, nach Beendigung des Schreibens von Daten, etc. vorher kurz auto-terminate.

Senden von Linux-Signalen mit Tastatursequenzen

Wussten Sie, dass jedes Mal, wenn Sie a CTRL+c Tastenfolge zu einem laufenden Programm, als Beispiel in einem Terminal, das stattdessen a SIGINT wird gesendet? Gehen wir zurück zu unserem Vertrauen sleep Befehl und versuchen Sie dies:

Ein Suspend-Prozess, der durch ein SIGINT-Signal unterbrochen wird, das über eine STRG-Tastenfolge gesendet wird + C

Hier starten wir sleep wieder, und drücke dann die Tastenkombination CTRL+c. Das Programm ist beendet, oder besser wurde unterbrochen für ihn SIGINT gesendetes Signal. Wir fordern den Exit-Code an und bestätigen, dass sich der Exit-Code erneut von den vorherigen Signalen unterscheidet.

Bitte beachten Sie, dass dieser Exit-Code, zum Schlafen, wird immer mit dem gesendeten Signal übereinstimmen, auch wenn möglicherweise nicht alle Signale abgedeckt werden. Mit anderen Worten, beim Benutzen CTRL+c auf der Kommandozeile, der Exit-Code wird immer sein 130, 137 wenn getötet mit kill -9, und 143 Wenn kill -15 es wurde benutzt.

Sie können die Befehls-Exit-Codes testen, indem Sie auf die $? Variable, der den Exit-Code des obigen Befehls enthält (solange kein neuer Befehl gestartet wurde). Kennen Sie den Exit-Code eines bestimmten Befehls in einer bestimmten Situation, und / oder als Folge eines bestimmten Signals, das an diesen Befehl gesendet wird, hilft beim Skripting von Lösungen, die andere Prozesse verarbeiten, etc. (was bei vielen Shell-Skripten der Fall ist, insbesondere bei der Verwaltung von Servern oder automatisierten Umgebungen).

Eine weitere häufig verwendete Tastatursequenz ist CTRL+z. Dies wird eine senden SIGTSTP Unterschrift, ein suspend Signal, das einen Vorgang sofort anhält, bis (als Beispiel) ein 'fg' Der Befehl wird für die gleiche Prozedur ausgegeben, die ihn wieder in den Vordergrund bringt.

Weitere Informationen zum Prozessmanagement, Konsultieren Sie Bash Process Termination Hacks.

Ende

In diesem Beitrag, diskutieren wir die wichtigsten Linux-Signale und wie wir sie praktisch in einer Linux- oder Unix-Umgebung einsetzen können. Die Kenntnis der grundlegenden Linux-Hinweise hilft einem bei der täglichen Verwendung und Verwaltung von Linux, als Beispiel, wenn eine Prozedur hängt und mit beendet werden muss kill -9. In einem zukünftigen Beitrag, Wir können erwägen, ein Signal mit der trap Befehl aus einem Bash-Skript heraus, die es ermöglicht, eine benutzerdefinierte Prozedur festzulegen, die ausgeführt wird, wenn das Signal gesendet wird.

Wenn es dir Spaß gemacht hat diesen Beitrag zu lesen, werfen Sie einen Blick auf unsere Bash Automation-Serie ab Bash Automation & Skripting-Grundlagen. Im dritten Post dieser Serie, wir analysieren auch die Verwaltung von Prozessen im Hintergrund, was bereits in diesem Beitrag erwähnt wurde.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.