GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wann sendet das System ein SIGTERM an einen Prozess?

Ich werde dies als Antwort posten, damit es eine Art Lösung gibt, falls sich herausstellt, dass dies das Problem ist.

Ein Exit-Status von 0 bedeutet einen normalen Exit aus einem erfolgreichen Programm. Ein beendendes Programm kann als Beendigungsstatus eine beliebige ganze Zahl zwischen 0 und 255 wählen. Herkömmlicherweise verwenden Programme kleine Werte. Werte 126 und höher werden von der Shell verwendet, um besondere Bedingungen zu melden, also ist es am besten, sie zu vermeiden.

Auf der C-API-Ebene melden Programme einen 16-Bit-Status¹, der sowohl den Beendigungsstatus des Programms als auch das Signal, das es beendet hat, falls vorhanden, codiert.

In der Shell wird der Beendigungsstatus eines Befehls (gespeichert in $? ) führt den tatsächlichen Beendigungsstatus des Programms und den Signalwert zusammen:Wenn ein Programm durch ein Signal beendet wird, $? auf einen Wert größer als 128 gesetzt ist (bei den meisten Shells ist dieser Wert 128 plus die Signalnummer; ATT ksh verwendet 256 + Signalnummer und yash verwendet 384 + Signalnummer, was die Mehrdeutigkeit vermeidet, aber die anderen Shells sind nicht gefolgt Anzug).

Insbesondere wenn $? 0 ist, wurde Ihr Programm normal beendet.

Beachten Sie, dass dies den Fall eines Prozesses einschließt, der SIGTERM empfängt, aber einen Signalhandler dafür hat und schließlich normal beendet wird (vielleicht als indirekte Folge des SIGTERM-Signals, vielleicht auch nicht).

Um die Frage in Ihrem Titel zu beantworten, wird SIGTERM niemals automatisch vom System gesendet. Es gibt ein paar Signale, die automatisch gesendet werden, wie SIGHUP, wenn ein Terminal weggeht, SIGSEGV/SIGBUS/SIGILL, wenn ein Prozess Dinge tut, die er nicht tun sollte, SIGPIPE, wenn er in eine defekte Pipe/Socket schreibt usw. Und es gibt ein paar Signale, die aufgrund eines Tastendrucks in einem Terminal gesendet werden, hauptsächlich SIGINT für Ctrl +C , SIGQUIT für Strg +\ und SIGTSTP für Ctrl +Z , aber SIGTERM gehört nicht dazu. Wenn ein Prozess SIGTERM empfängt, hat ein anderer Prozess dieses Signal gesendet.

¹ grob gesagt


SIGTERM ist das Signal, das normalerweise verwendet wird, um einen Prozess administrativ zu beenden.

Das ist kein Signal, das der Kernel senden würde, aber das ist das Signal, das ein Prozess normalerweise senden würde, um einen anderen Prozess (anständig) zu beenden.

Das ist das Signal, das standardmäßig von kill gesendet wird , pkill , killall ... Befehle.

Das ist das Signal, das an Daemons gesendet wird, um sie zu stoppen (wie bei einem service some-service stop ) oder per init gesendet vor dem Herunterfahren (gefolgt von SIGKILL für jene Prozesse, die es nicht geschafft haben, rechtzeitig bei SIGTERM zu beenden).

Beachten Sie, dass SIGTERM nicht ist das Signal, das auf ^C gesendet wird . Das Signal, das auf ^C gesendet wird ist SIGINT.


Linux
  1. Neuer übergeordneter Prozess, wenn der übergeordnete Prozess stirbt?

  2. Wie verfolgt Unix das Arbeitsverzeichnis eines Benutzers beim Navigieren im Dateisystem?

  3. Was bedeutet &am Ende eines Linux-Befehls?

  4. Wie kann ich einen Benutzer in Linux löschen, wenn das System sagt, dass er derzeit in einem Prozess verwendet wird?

  5. Warum ruft popen() eine Shell auf, um einen Prozess auszuführen?

SIGTERM vs. SIGKILL:Was ist der Unterschied?

So senden Sie Prozesse unter Linux an den Hintergrund

Was ist die Linux-Prozesstabelle? Woraus besteht es?

Wie kann ich unter Linux feststellen, welcher Prozess meinem Prozess ein Signal gesendet hat?

Warum führt das Forking meines Prozesses dazu, dass die Datei unendlich gelesen wird?

Was passiert beim Senden von SIGKILL an einen Zombie-Prozess unter Linux?