斷開連線後是否需要斷開某個進程才能繼續運作?

斷開連線後是否需要斷開某個進程才能繼續運作?

disown如果您希望在斷開連線後仍保持作業運行,有人會解釋是否有必要以及為什麼有必要嗎?

我問這個問題是因為我訪問過的每個網站都說要使用disownandbgbg它本身對我有用,我不知道為什麼。

是因為我還沒有完全理解它的disown用途,還是有一些設定影響了bg指令的預設行為?

這就是我所做的:

  • 透過 SSH 連接到我的 CentOS 6 機器
  • 創建了一個簡單的流程:

    tar zcvf example.tar.gz ./examplepath > /dev/null 2>&1
    
  • 暫停了工作

  • 透過在後台恢復它bg 1
  • 與 SSH 伺服器斷開連接

然後我透過 FTP 檢查該.tar.gz檔案的大小是否仍在增長,事實確實如此。

答案1

透過背景運行的進程bg通常&會在以下兩種情況下死亡:

  1. shell 收到 SIGHUP
  2. 他們嘗試寫入不再存在的終端。

項目 #1 是關閉終端時的罪魁禍首。然而它是否發生取決於如何你關閉你的終端。您可以透過以下方式關閉它:

  1. 例如在視窗管理器中點選“X”
  2. 您可以鍵入exitlogoutCTRL+ D

第 #1 項將導致發送 SIGHUP。 #2 沒有。

長話短說,如果您使用 後台進程,然後使用、或+bg註銷,該進程將不會被終止。exitlogoutCTRLD

答案2

當您關閉終端機時,使用該終端的所有進程(請參閱輸出TTY中的列ps -elf)都會收到一個SIGHUP.這取決於進程要做什麼SIGHUP。在經典的 UNIX(AIX、Solaris)中,進程在此訊號上關閉。這就是為什麼你需要使用disown.從man bash

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

相關內容