Linux

系統何時向程序發送 SIGTERM?

  • January 11, 2020

我的伺服器程序收到 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 for Ctrl+\和 SIGTSTP for Ctrl+ Z,但 SIGTERM 不是其中之一。如果一個程序收到 SIGTERM,則其他程序發送該信號。

¹粗略地說

引用自:https://unix.stackexchange.com/questions/10231