為什麼使用“nohup &”而不是“exec &”

為什麼使用“nohup &”而不是“exec &”

我知道,nohup作為一個二進位文件,可以從任何 shell 存取它。但exec內建的可能存在於每個 shell 中。

有理由選擇其中一個而不是另一個嗎?

答案1

魚和自行車哪個比較好?nohupexec做不同的事情。

exec用另一個程式取代 shell。exec在簡單的後台作業中使用並沒有什麼用處:exec myprogram; more stuff將 shell 替換為myprogramand 因此不會運行more stuff,這與終止時myprogram; more stuff運行不同;但在後台啟動然後運行,就像.more stuffmyprogramexec myprogram & more stuffmyprogrammore stuffmyprogram & 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(終止訊號)並繼續執行,即使您的終端已關閉。

execSIGHUP當收到a 時,進程終止,但nohup進程繼續。

答案3

shell內建指令exec <command>將shell替換為<command>,沒有新進程,也沒有建立新的PID。通常完成後<command>您的終端將關閉。首先在後台運行它會創建一個子 shell,然後類似地立即被替換為<command>.

nohup <command> 命令將運行<command>,但不會掛起(kill -s 1),因此當啟動該命令的終端 shell 關閉時,該命令不會終止。首先在背景運行它,建立一個子 shell,然後該命令在後台運行,讓您返回提示符。

在腳本編寫中,即時效果或多或少是相同的,<command>都是由腳本啟動,並且腳本將繼續,而無需等待<command>啟動、發送輸出或完成。

答案4

你無法nohupexec.當您使用 執行可執行檔時nohup,登出(ssh 會話)時該進程不會被終止;通常nohup與 一起使用nice以較低優先權運行進程。依照慣例,該HUP訊號是終端警告相關進程註銷的方式

相關內容