disown -h
和 nohup
有效地工作相同嗎?
disown
- 導致 shell 在 shell 終止時不發送 SIGHUP 到其不承認的作業,並且
- 從 shell 的作業控制中刪除不承認的作業。
第一個是第二個的結果嗎?換句話說,如果從 shell 啟動的程序以任何方式從 shell 的作業控制中刪除,shell 是否不會在 shell 終止時向程序發送 SIGHUP?
disown -h
仍然將程序置於 shell 的作業控制之下。這是否意味著disown -h
讓程序仍然接收到從shell發送的SIGHUP,但是將程序的SIGHUP動作設置為“忽略”?這聽起來類似於nohup
。$ sleep 123 & disown -h [1] 26103 $ jobs [1]+ Running sleep 123 & $ fg 1 sleep 123 $ ^Z [1]+ Stopped sleep 125 $ bg 1 [1]+ sleep 123 & $ exit $ ps aux | grep sleep t 26103 0.0 0.0 14584 824 ? S 15:19 0:00 sleep 123
如果我們忽略他們在使用終端方面的差異,是否可以有效地工作
disown -h
?nohup
謝謝。
nohup
和disown -h
不完全相同的東西。使用
disown
,從目前互動式 shell 中的作業列表中刪除一個程序。jobs
在啟動後台程序並執行後執行不會disown
將該程序顯示為 shell 中的作業。退出的作業在退出時不會收到HUP
來自 shell 的 a(但請參閱末尾的註釋)。使用
disown -h
,該作業不會從作業列表中刪除,但如果它退出,shell 不會向HUP
它發送信號(但請參閱末尾的註釋)。該
nohup
實用程序忽略該HUP
信號並啟動給定的實用程序。該實用程序繼承了信號遮罩,nohup
因此也將忽略該HUP
信號。當 shell 終止時,該程序仍然是nohup
(並nohup
重新成為init
)的子程序。不同之處在於,無論誰發送信號,程序都以
nohup
忽略開始。HUP
被拒絕的程序只是沒有由shell**發送HUP
信號,但仍可能從 eg 發送信號並且不會忽略這一點。kill -s HUP <pid>
請注意,
HUP
僅在以下情況下才會發送到 shell 的作業
- shell 是登錄 shell 並且
huponexit
設置了 shell 選項,或者- 外殼本身接收到一個
HUP
信號。手冊中的相關內容
bash
(我的重點):信號
$$ … $$ 預設情況下,shell在收到
SIGHUP
. 在退出之前,互動式 shell 將重新發送SIGHUP
給所有正在執行或停止的作業。發送已停止的作業SIGCONT
以確保它們收到SIGHUP
. 為防止 shell 將信號發送到特定作業,應使用disown
內置函式(見下文)將其從作業表中刪除,或 使用SHELL BUILTIN COMMANDS
標記為不接收。SIGHUP``disown -h
如果
huponexit
shell 選項已設置為shopt
,則在互動式登錄 shell 退出時向所有作業bash
發送 a 。SIGHUP
disown [-ar] [-h] [jobspec ... | pid ... ]
如果沒有選項,
jobspec
請從活動作業表中刪除每個選項。$$ … $$如果
-h
給出了選項,則每個jobspec
都不會從表中刪除,但會被標記,以便**SIGHUP
在 shell 接收到SIGHUP
**.$$ … $$有關的: