Linux

註銷時後台程序是否會收到 SIGHUP?

  • January 18, 2016

這是對這個問題的跟進。

我已經進行了更多測試;看起來這是在物理控制台還是通過 SSH 完成並不重要,這也不僅僅發生在 SCP 上;我也用cat /dev/zero > /dev/null. 行為完全相同:

  • 使用在後台啟動一個程序&(或在它開始使用CTRL-Zand後將其置於後台bg);這是在***不使用nohup***的情況下完成的。
  • 註銷。
  • 再次登錄。
  • 該程序仍然存在,執行愉快,現在是init.

如果發送 ; 我可以確認 SCP 和 CAT 都立即退出SIGHUP;我使用kill -HUP.

因此,看起來 SIGHUP在註銷時沒有發送,至少發送到後台程序(由於顯而易見的原因,無法使用前台進行測試)。

這最初發生在我的 VMware ESX 3.5(基於 RedHat)的服務控制台上,但我能夠在 CentOS 5.4 上完全複製它。

再次,問題是:是否應該在註銷時將 SIGHUP 發送到程序,即使它們在後台執行?為什麼這沒有發生?


編輯

strace根據凱爾的回答,我檢查了。正如我所料,從啟動它的 shell 註銷時

,該程序沒有收到***任何信號。***這在使用伺服器的控制台和通過 SSH 時都會發生。

找到答案。

對於 BASH,這取決於huponexitshell 選項,可以使用內置shopt命令查看和/或設置。

看起來這個選項預設是關閉的,至少在基於 RedHat 的系統上是這樣。

有關BASH 手冊頁的更多資訊:

shell 在收到 SIGHUP 後預設退出。在退出之前,互動式 shell 會將 SIGHUP 重新發送到所有正在執行或停止的作業。停止的作業被發送 SIGCONT 以確保它們收到 SIGHUP。為防止 shell 將信號發送到特定作業,應使用 disown 內置命令將其從作業表中刪除(請參閱下面的 SHELL BUILTIN 命令)或使用 disown -h 將其標記為不接收 SIGHUP。

如果已使用 shopt 設置了 huponexit shell 選項,則當互動式登錄 shell 退出時,bash 會向所有作業發送 SIGHUP。

引用自:https://serverfault.com/questions/117152