如果我啟動後台程序然後註銷,它會繼續執行嗎?
在與同事長時間討論後問這個問題,我真的很想在這裡澄清一下。
我啟動了一個後台程序,或者通過將“
&
”附加到命令行,或者通過CTRL-Z
使用“”停止它並在後台恢復它bg
。然後我退出。發生什麼了?
我們很確定它應該被 SIGHUP 殺死,但這並沒有發生;再次登錄後,該程序正在愉快地執行,並
pstree
顯示它已被init
.這是預期的行為嗎?
但是,如果是,那麼該
nohup
命令的目的是什麼?看起來這個過程無論如何都不會被殺死,不管有沒有它……編輯 1
更多細節:
- 該命令是從 SSH 會話啟動的,而不是從物理控制台啟動的。
- 該命令在沒有
nohup
和/或的情況下啟動&
;然後它被暫停CTRL-Z
並在後台恢復bg
。- ssh 會話沒有中斷。有一個實際的註銷(“
exit
”命令)。- 該過程是
scp
文件複製操作。- 再次登錄後,
pstree
顯示該程序正在執行並且是init
.編輯 2
為了更清楚地說明問題:將程序置於後台(使用
&
orbg
)使其忽略SIGHUP
,就像nohup
命令一樣?編輯 3
我嘗試手動發送一個
SIGHUP
toscp
: 它退出了,所以它絕對不會忽略這個信號。然後我再次嘗試啟動它,將其置於後台並註銷:它被“採用”
init
並繼續執行,我在重新登錄時發現它在那裡。我現在很困惑。
SIGHUP
註銷後似乎根本沒有發送。
找到答案。
對於 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。