disown
如果您希望在斷開連線後仍保持作業運行,有人會解釋是否有必要以及為什麼有必要嗎?
我問這個問題是因為我訪問過的每個網站都說要使用disown
andbg
但bg
它本身對我有用,我不知道為什麼。
是因為我還沒有完全理解它的disown
用途,還是有一些設定影響了bg
指令的預設行為?
這就是我所做的:
- 透過 SSH 連接到我的 CentOS 6 機器
創建了一個簡單的流程:
tar zcvf example.tar.gz ./examplepath > /dev/null 2>&1
暫停了工作
- 透過在後台恢復它
bg 1
- 與 SSH 伺服器斷開連接
然後我透過 FTP 檢查該.tar.gz
檔案的大小是否仍在增長,事實確實如此。
答案1
透過背景運行的進程bg
通常&
會在以下兩種情況下死亡:
- shell 收到 SIGHUP
- 他們嘗試寫入不再存在的終端。
項目 #1 是關閉終端時的罪魁禍首。然而它是否發生取決於如何你關閉你的終端。您可以透過以下方式關閉它:
- 例如在視窗管理器中點選“X”
- 您可以鍵入
exit
、logout
或CTRL+ D。
第 #1 項將導致發送 SIGHUP。 #2 沒有。
長話短說,如果您使用 後台進程,然後使用、或+bg
註銷,該進程將不會被終止。exit
logout
CTRLD
答案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。