Bash

disown -hnohup 有效地工作相同嗎?

  • November 26, 2018

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 -hnohup

謝謝。

nohupdisown -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

如果huponexitshell 選項已設置為shopt,則在互動式登錄 shell 退出時向所有作業bash發送 a 。SIGHUP

disown [-ar] [-h] [jobspec ... | pid ... ]

如果沒有選項,jobspec請從活動作業表中刪除每個選項。

$$ … $$如果-h給出了選項,則每個jobspec不會從表中刪除,但會被標記,以便**SIGHUP在 shell 接收到SIGHUP**.$$ … $$

有關的:

引用自:https://unix.stackexchange.com/questions/484276