註銷時後台程序是否會收到 SIGHUP?
這是對這個問題的跟進。
我已經進行了更多測試;看起來這是在物理控制台還是通過 SSH 完成並不重要,這也不僅僅發生在 SCP 上;我也用
cat /dev/zero > /dev/null
. 行為完全相同:
- 使用在後台啟動一個程序
&
(或在它開始使用CTRL-Z
and後將其置於後台bg
);這是在***不使用nohup
***的情況下完成的。- 註銷。
- 再次登錄。
- 該程序仍然存在,執行愉快,現在是
init
.如果發送 ; 我可以確認 SCP 和 CAT 都立即退出
SIGHUP
;我使用kill -HUP
.因此,看起來 SIGHUP在註銷時沒有發送,至少發送到後台程序(由於顯而易見的原因,無法使用前台進行測試)。
這最初發生在我的 VMware ESX 3.5(基於 RedHat)的服務控制台上,但我能夠在 CentOS 5.4 上完全複製它。
再次,問題是:是否應該在註銷時將 SIGHUP 發送到程序,即使它們在後台執行?為什麼這沒有發生?
編輯
strace
根據凱爾的回答,我檢查了。正如我所料,從啟動它的 shell 註銷時,該程序沒有收到***任何信號。***這在使用伺服器的控制台和通過 SSH 時都會發生。
找到答案。
對於 BASH,這取決於
huponexit
shell 選項,可以使用內置shopt
命令查看和/或設置。看起來這個選項預設是關閉的,至少在基於 RedHat 的系統上是這樣。
有關BASH 手冊頁的更多資訊:
shell 在收到 SIGHUP 後預設退出。在退出之前,互動式 shell 會將 SIGHUP 重新發送到所有正在執行或停止的作業。停止的作業被發送 SIGCONT 以確保它們收到 SIGHUP。為防止 shell 將信號發送到特定作業,應使用 disown 內置命令將其從作業表中刪除(請參閱下面的 SHELL BUILTIN 命令)或使用 disown -h 將其標記為不接收 SIGHUP。
如果已使用 shopt 設置了 huponexit shell 選項,則當互動式登錄 shell 退出時,bash 會向所有作業發送 SIGHUP。