Mein Serverprogramm hat ein SIGTERM empfangen und angehalten (mit Exit-Code 0). Das überrascht mich, denn ich bin mir ziemlich sicher, dass es genügend Speicher dafür gab. Unter welchen Bedingungen sendet Linux (Busybox) ein SIGTERM an einen Prozess?
24
$?
gäbe , würde es auf 143 (128 + Signalnummer) gesetzt.Antworten:
Ich werde dies als Antwort posten, damit es eine Lösung gibt, falls sich herausstellt, dass dies das Problem ist.
Ein Beendigungsstatus von 0 bedeutet ein normales Beenden eines erfolgreichen Programms. Ein Programm, das beendet wird, kann eine beliebige Ganzzahl zwischen 0 und 255 als Beendigungsstatus auswählen. Herkömmlicherweise verwenden Programme kleine Werte. Werte 126 und höher werden von der Shell verwendet, um spezielle Bedingungen zu melden. Vermeiden Sie sie daher am besten.
Auf der C-API-Ebene melden Programme einen 16-Bit-Status¹ , der sowohl den Exit-Status des Programms als auch das Signal codiert, das es ggf. beendet hat.
In der Shell setzt sich der Exit-Status eines Befehls (gespeichert in
$?
) aus dem tatsächlichen Exit-Status des Programms und dem Signalwert zusammen: Wenn ein Programm durch ein Signal beendet wird,$?
wird dieser Wert auf einen Wert größer als 128 gesetzt (bei den meisten Shells ist dies der Wert 128 plus die Signalnummer; ATT ksh verwendet 256 + Signalnummer und Yash 384 + Signalnummer, was die Mehrdeutigkeit vermeidet, aber die anderen Shells folgen nicht).Insbesondere wenn
$?
0 ist, wird Ihr Programm normal beendet.Beachten Sie, dass dies den Fall eines Prozesses einschließt, der SIGTERM empfängt, jedoch über einen Signal-Handler verfügt und schließlich normal beendet wird (möglicherweise als indirekte Folge des SIGTERM-Signals, möglicherweise nicht).
Um die Frage in Ihrem Titel zu beantworten, wird SIGTERM vom System niemals automatisch gesendet. Es gibt ein paar Signale, die automatisch gesendet werden, wie SIGHUP, wenn ein Terminal ausgeht, SIGSEGV / SIGBUS / SIGILL, wenn ein Prozess Dinge tut, die er nicht tun sollte, SIGPIPE, wenn er auf eine defekte Pipe / Muffe schreibt, usw. Und es gibt Einige Signale, die aufgrund eines Tastendrucks in einem Terminal gesendet werden, hauptsächlich SIGINT für Ctrl+ C, SIGQUIT für Ctrl+ \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
quelle
exit
. Deryash
Ansatz ist ein guter Kompromiss, aber siehe RC für einen anderen. Siehe auch Standard-Exit-Code, wenn der Prozess beendet wird.SIGTERM ist das Signal, das normalerweise zum administrativen Beenden eines Prozesses verwendet wird.
Dies ist kein Signal, das der Kernel senden würde, sondern das Signal, das ein Prozess normalerweise sendet, um einen anderen Prozess (ordnungsgemäß) zu beenden.
Das ist das Signal , das von den standardmäßig gesendet wird
kill
,pkill
,killall
,fuser -k
... Befehle.Dies ist das Signal, das an Daemons gesendet wird, um sie zu stoppen (wie bei a
service some-service stop
) oderinit
vor dem Herunterfahren (gefolgt von SIGKILL für Prozesse, die bei SIGTERM nicht rechtzeitig beendet werden konnten).Beachten Sie, dass SIGTERM nicht das Signal ist, auf das gesendet wird
^C
. Das gesendete Signal^C
ist SIGINT.quelle