Shell
後台工作去哪兒了?
從 gnome-terminal 我知道可以使用 Cz 暫停作業,然後將其發送到後台。當我關閉終端時,過程並沒有結束。工作是從哪裡管理的,還是失去了?
您的後台作業會繼續執行,直到有人通過發送信號告訴它停止。它可能會以幾種方式死亡:
- 當終端因任何原因離開時,它會發送一個HUP 信號(“掛斷”,如調製解調器掛斷)到在其內部執行的 shell(更準確地說,發送到控制程序)和前台程序組中的程序。因此,在後台執行的程序不會受到影響,但是……
- 當 shell 接收到 HUP 信號時,它會將其傳播到後台作業。所以如果後台程序沒有忽略這個信號,它就會在此時死掉。
- 如果程序在離開後嘗試從終端讀取或寫入,則讀取或寫入將失敗並出現輸入/輸出錯誤 (EIO)。然後程序可能決定退出。
- 當然,您(或您的系統管理員)可以隨時決定終止該程序。
如果您關心的是保持程序執行,那麼:
- 如果程序可能與終端互動,請使用Screen或Tmux在虛擬終端中執行程序,您可以隨意斷開和重新連接。
- 如果程序只需要繼續執行而不是互動式的,請使用
nohup
命令 (nohup myprogram --option somearg
) 啟動它,這可以確保 shell 不會向它發送 SIGHUP,將標準輸入/dev/null
重定向到並將標準輸出和標準錯誤重定向到名為nohup.out
.- 如果您已經啟動了程序並且不希望它在您關閉終端時死掉,請執行
disown
內置程序(如果您的 shell 有一個)。如果沒有,您可以通過以極端偏見殺死 shell(kill -KILL $$
從該 shell 中繞過指定程序具有的任何退出觸發器)來避免 shell 傳播 SIGHUP。- 如果您已經啟動了該程序並想將其重新連接到另一個終端,有一些方法,但它們不是 100% 可靠的。請參閱如何取消正在執行的程序並將其關聯到新的螢幕外殼?和相關的問題。