較不暴力的殺戮信號-HUP(1)-INT(2)和-TERM(15)之間的區別
除了最暴力的
kill -9
(SIGKILL)之外,我不太了解其他 3 個常見信號(此處)-HUP
(1)、-INT
(2)和-TERM
(15)之間的區別。在哪些情況下一種有效而另一種無效?
一般來說
-9
(-KILL
) 什麼時候失敗?對我來說,他們似乎要求程序優雅地終止,而不保存。評價嚴酷程度,我會說
-HUP < -TERM < -INT < -KILL
。
SIGKILL 永遠不會殺死正在執行的程序,這就是重點。存在其他信號以使應用程序有機會做出反應。
SIGINT、SIGTERM、SIGQUIT 和 SIGHUP 的預設行為是終止程序。但是,允許應用程序為這些信號安裝處理程序。因此,應用程序在接收到這些信號時的實際行為是一個約定問題(每個應用程序可能遵循也可能不遵循),而不是系統設計。
SIGINT 是其中“最弱的”。它的傳統含義是“停止你現在正在做的事情並等待進一步的使用者輸入”。這是終端中
Ctrl
+生成的信號。C
非互動式程序通常將其視為 SIGTERM。SIGTERM 是“正常”的終止信號。它告訴應用程序乾淨地退出。應用程序可能需要時間來保存其狀態、釋放資源(例如原本會留在後面的臨時文件等)。不想在關鍵應用程序期間中斷的應用程序可能會暫時忽略 SIGTERM。
SIGHUP 在苛刻性方面與 SIGTERM 大致相同,但它具有特定的作用,因為當使用者與終端斷開連接時,它會自動發送到在終端中執行的應用程序(從詞源上講,因為使用者通過電話線和調製解調器連接掛了)。SIGHUP 通常是非自願的,與必須顯式發送的 SIGTERM 不同,因此應用程序應嘗試將其狀態保存在 SIGHUP 上。SIGHUP 對於非面向使用者的應用程序(守護程序)還有一個完全不同的傳統含義,即重新載入它們的配置文件。
SIGQUIT 是可忽略信號中最苛刻的。當應用程序行為不端並且需要立即終止時使用它,並且預設情況下它傳統上會留下核心轉儲文件(大多數使用者不知道核心文件是什麼的現代系統預設情況下往往不會生成它們) . 應用程序可以設置一個處理程序,但應該做的很少(特別是不保存任何狀態),因為 SIGQUIT 的意圖是在出現嚴重錯誤時使用。