Linux

如果我啟動後台程序然後註銷,它會繼續執行嗎?

  • November 16, 2021

在與同事長時間討論後問這個問題,我真的很想在這裡澄清一下。

我啟動了一個後台程序,或者通過將“ &”附加到命令行,或者通過CTRL-Z使用“”停止它並在後台恢復它bg。然後我退出。

發生什麼了?

我們很確定它應該被 SIGHUP 殺死,但這並沒有發生;再次登錄後,該程序正在愉快地執行,並pstree顯示它已被init.

這是預期的行為嗎?

但是,如果是,那麼該nohup命令的目的是什麼?看起來這個過程無論如何都不會被殺死,不管有沒有它……


編輯 1

更多細節:

  • 該命令是從 SSH 會話啟動的,而不是從物理控制台啟動的。
  • 該命令在沒有 nohup和/或的情況下啟動&;然後它被暫停CTRL-Z並在後台恢復bg
  • ssh 會話沒有中斷。有一個實際的註銷(“ exit”命令)。
  • 該過程是scp文件複製操作。
  • 再次登錄後,pstree顯示該程序正在執行並且是init.

編輯 2

為了更清楚地說明問題:將程序置於後台(使用&or bg)使其忽略SIGHUP,就像nohup命令一樣?


編輯 3

我嘗試手動發送一個SIGHUPto scp: 它退出了,所以它絕對不會忽略這個信號。

然後我再次嘗試啟動它,將其置於後台並註銷:它被“採用”init並繼續執行,我在重新登錄時發現它在那裡。

我現在很困惑。SIGHUP註銷後似乎根本沒有發送。

找到答案。

對於 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/115999