簡體   English   中英

nohup 和 & 和有什么不一樣

[英]What's the difference between nohup and ampersand

nohup myprocess.out &myprocess.out &將 myprocess.out 設置為在后台運行。 關閉終端后,該進程仍在運行。 它們之間有什么區別?

nohup捕獲掛斷信號(請參閱man 7 signal )而&符號則沒有(除了外殼以這種方式配置或根本不發送SIGHUP )。

通常,當使用&運行命令並隨后退出 shell 時,shell 將使用掛斷信號( kill -SIGHUP <pid> )終止子命令。 使用nohup可以防止這種情況,因為它會捕獲信號並忽略它,因此它永遠不會到達實際應用程序。

如果您使用 bash,您可以使用命令shopt | grep hupon shopt | grep hupon以確定您的 shell 是否將 SIGHUP 發送到其子進程。 如果它關閉,進程將不會被終止,就像你的情況一樣。 可以在此處找到有關 bash 如何終止應用程序的更多信息。

在某些情況下nohup不起作用,例如當您啟動的進程重新連接SIGHUP信號時,就像這里的情況一樣。

myprocess.out &將使用子外殼在后台運行該進程。 如果當前 shell 被終止(比如注銷),所有子 shell 也會被終止,因此后台進程也將被終止。 nohup命令會忽略HUP信號,因此即使當前 shell 終止,子 shell 和myprocess.out也會繼續在后台運行。 另一個區別是&單獨不會重定向 stdout/stderr,因此如果有任何輸出或錯誤,它們會顯示在終端上。 另一方面, nohup 將 stdout/stderr 重定向到nohup.out$HOME/nohup.out

大多數時候我們使用 ssh 登錄到遠程服務器。 如果您啟動 shell 腳本並注銷,則該進程將被終止。 即使從 shell 注銷后,Nohup 也有助於在后台繼續運行腳本。

Nohup command name &
eg: nohup sh script.sh &

Nohup 捕捉 HUP 信號。 Nohup 不會自動將作業置於后台。 我們需要明確地使用 &

使用與號 (&) 將在子進程(當前 bash 會話的子進程)中運行命令。 但是,當您退出會話時,所有子進程都將被終止。

使用 nohup + &符號(&)會做同樣的事情,除了當會話結束時,子進程的父進程將更改為“1”,即“init”進程,從而防止子進程被殺死。

如果我錯了糾正我

  nohup myprocess.out &

nohup捕獲掛斷信號,這意味着它會在終端關閉時發送一個進程。

 myprocess.out &

進程可以運行,但一旦終端關閉就會停止。

nohup myprocess.out

即使終端關閉,進程也能運行,但您可以通過在終端中按ctrl + z來停止進程。 如果&存在&Crt + z不起作用。

nohup 命令是一個信號屏蔽實用程序,可以捕獲掛斷信號。 因為&符號沒有捕捉到掛斷信號。 當使用 & 運行命令並退出 shell 時,shell 將使用掛斷信號終止子命令。 這可以通過使用 nohup 來防止,因為它會捕獲信號。 Nohup 命令接受可以由內核發送到進程並阻止它們的掛斷信號。 當用戶想要啟動長時間運行的應用程序注銷或關閉啟動進程的窗口時,Nohup 命令很有用。 這些操作中的任何一個通常都會提示內核掛斷應用程序,但 nohup 包裝器將允許進程繼續。 使用&符號將在子進程和當前 bash 會話的這個子進程中運行命令。 當您退出會話時,該進程的所有子進程都將被終止。 &符號與活動外殼的作業控制有關。 這對於在后台運行會話中的進程很有用。

在很多情況下,環境之間的細微差異都會讓您感到厭煩。 這是我最近跑到的一個。 這兩個命令有什么區別?

1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &

答案和往常一樣——這取決於。

nohup 捕獲掛斷信號,而&符號則沒有。

什么是掛斷信號?

SIGHUP - 在控制終端上檢測到掛斷或控制進程死亡(值:1)。

通常,當使用 & 運行命令並隨后退出 shell 時,shell 將使用掛斷信號終止子命令(如 kill -SIGHUP $PID)。 這可以使用 nohup 來防止,因為它捕獲信號並忽略它,因此它永遠不會到達實際應用程序。

很好,但就像在這種情況下一樣,總是有“但是”。 當 shell 以完全不發送 SIGHUP 的方式配置時,這些啟動方法之間沒有區別。

如果您正在使用 bash,您可以使用下面指定的命令來確定您的 shell 是否向其子進程發送 SIGHUP:

~ $ shopt | grep hupon

而且 - 有些情況下 nohup 不起作用。 例如,當您啟動的進程重新連接 NOHUP 信號時(它在內部完成,在應用程序代碼級別)。

在所描述的情況下,當在自定義服務啟動腳本中調用第二個腳本時,缺乏差異讓我感到困惑,該腳本在沒有 nohup 命令的情況下設置和啟動正確的應用程序。

在一個 Linux 環境中,一切運行順利,在第二個環境中,應用程序在第二個腳本退出時立即退出(檢測這種情況,當然比你想象的要花費更多的時間:stuck_out_tongue:)。

將 nohup 作為啟動方法添加到第二個腳本后,即使腳本將退出,應用程序也會繼續運行,並且此行為在兩個環境中變得一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM