Linux
系統何時向程序發送 SIGTERM?
我的伺服器程序收到 SIGTERM 並停止(退出程式碼為 0)。我對此感到驚訝,因為我很確定它有足夠的記憶體。linux(busybox)在什麼條件下向程序發送SIGTERM?
我會將此作為答案發布,以便在出現問題時找到某種解決方案。
退出狀態為 0 表示從成功的程序中正常退出。退出程序可以選擇 0 到 255 之間的任何整數作為其退出狀態。通常,程序使用較小的值。shell 使用 126 及以上的值來報告特殊情況,因此最好避免使用它們。
在 C API 級別,程序報告一個 16 位狀態¹,該狀態對程序的退出狀態和殺死它的信號(如果有)進行編碼。
在 shell 中,命令的退出狀態(
$?
保存在$?
128加信號號;ATT ksh用256+信號號,yash用384+信號號,避免了歧義,但其他shell沒有效仿)。特別是,如果
$?
為 0,則您的程序正常退出。請注意,這包括接收 SIGTERM 的程序,但有一個信號處理程序,並最終正常退出(可能是 SIGTERM 信號的間接結果,也可能不是)。
要回答標題中的問題,系統永遠不會自動發送 SIGTERM。有一些信號會在終端消失時自動發送,例如 SIGHUP,當程序執行不應該做的事情時會自動發送 SIGSEGV/SIGBUS/SIGILL,當它寫入損壞的管道/套接字時會自動發送 SIGPIPE,等等。還有由於終端中的按鍵而發送的一些信號,主要是 SIGINT for
Ctrl
+C
, SIGQUIT forCtrl
+\
和 SIGTSTP forCtrl
+Z
,但 SIGTERM 不是其中之一。如果一個程序收到 SIGTERM,則其他程序發送該信號。¹粗略地說