我知道,nohup
作為一個二進位文件,可以從任何 shell 存取它。但exec
內建的可能存在於每個 shell 中。
有理由選擇其中一個而不是另一個嗎?
答案1
魚和自行車哪個比較好?nohup
並exec
做不同的事情。
exec
用另一個程式取代 shell。exec
在簡單的後台作業中使用並沒有什麼用處:exec myprogram; more stuff
將 shell 替換為myprogram
and 因此不會運行more stuff
,這與終止時myprogram; more stuff
運行不同;但在後台啟動然後運行,就像.more stuff
myprogram
exec myprogram & more stuff
myprogram
more stuff
myprogram & more stuff
nohup
執行指定的程式並忽略 SIGHUP 訊號。當終端關閉時,核心會向該終端(即 shell)中的控制進程發送 SIGHUP。 shell 依序向所有在背景執行的作業發送 SIGHUP。nohup
如果終端當機(例如,如果您遠端登入並且連線斷開,或者如果您關閉終端模擬器,就會發生這種情況),執行作業可以防止它以這種方式被終止。
nohup
也將程式的輸出重定向到檔案nohup.out
.這可以避免程式因無法寫入其輸出或錯誤輸出而死亡。請注意,這nohup
不會重定向輸入。要完全斷開程式與啟動它的終端的連接,請使用
nohup myprogram </dev/null >myprogram.log 2>&1 &
答案2
exec &
=> 將進程作為背景處理執行,因此您可以繼續使用相同終端執行其他作業。
nohup
=> 避免所有 SIGHUP(終止訊號)並繼續執行,即使您的終端已關閉。
exec
SIGHUP
當收到a 時,進程終止,但nohup
進程繼續。
答案3
shell內建指令exec <command>
將shell替換為<command>
,沒有新進程,也沒有建立新的PID。通常完成後<command>
您的終端將關閉。首先在後台運行它會創建一個子 shell,然後類似地立即被替換為<command>
.
該nohup <command>
命令將運行<command>
,但不會掛起(kill -s 1),因此當啟動該命令的終端 shell 關閉時,該命令不會終止。首先在背景運行它,建立一個子 shell,然後該命令在後台運行,讓您返回提示符。
在腳本編寫中,即時效果或多或少是相同的,<command>
都是由腳本啟動,並且腳本將繼續,而無需等待<command>
啟動、發送輸出或完成。
答案4
你無法nohup
與exec
.當您使用 執行可執行檔時nohup
,登出(ssh 會話)時該進程不會被終止;通常nohup
與 一起使用nice
以較低優先權運行進程。依照慣例,該HUP
訊號是終端警告相關進程註銷的方式