首頁 > 軟體

一文帶你深入理解Linux中的nohup命令

2023-04-02 06:03:35

前言

當我們在Linux或Unix系統上執行一個長時間執行的命令或指令碼時,我們通常會遇到一個問題,那就是在終端關閉或者退出後,該程序也會隨之停止執行。在這種情況下,我們需要一種方式來讓程序在後臺執行,而不受終端關閉的影響。這時,nohup命令就派上用場了。

nohup是什麼

nohup是Linux和Unix系統中的一個命令,其作用是在終端退出時,讓程序在後臺繼續執行。它的全稱為“no hang up”,意為“不掛起”。nohup命令可以讓你在退出終端或關閉SSH連線後繼續執行命令。

nohup語法規則

nohup命令的基本語法如下:

nohup COMMAND [ARGS ...] [> output-file 2> error-file] &

其中的引數含義如下:

  • COMMAND:需要在後臺執行的命令或指令碼。
  • ARGS:命令或指令碼的引數。
  • > output-file:輸出重定向到指定的檔案中。
  • 2> error-file:錯誤資訊重定向到指定的檔案中。
  • &:將命令放在後臺執行。

nohup命令的執行過程分為以下幾個步驟:

  • nohup命令將當前shell的標準輸入、標準輸出和標準錯誤輸出全部重定向到/dev/null裝置中,避免被關閉終端的訊號所中斷。
  • nohup命令將程序放到後臺執行,並將程序的PID輸出到終端。
  • 程序開始執行,並將標準輸出和標準錯誤輸出重定向到指定的檔案中。
  • 使用者可以退出終端或關閉終端視窗,程序仍然在後臺執行。

nohup使用方法

使用nohup命令非常簡單,按照上面的基本語法即可。以下是一些nohup命令的用法範例:

後臺執行命令

要在後臺執行命令,只需要在命令列中輸入以下命令即可:

nohup COMMAND &

例如,在後臺執行一個Bash指令碼:

nohup bash test.sh &

標準輸出重定向到檔案

nohup bash test.sh > stdout.txt &

標準錯誤輸出重定向到檔案

nohup bash test.sh 2> stderr.txt &

將標準輸出和標準錯誤輸出都重定向到檔案

1. 重定向到同一檔案

nohup bash test.sh > output.txt 2>&1 &

2. 重定向到不同檔案

nohup bash test.sh > stdout.txt 2> stderr.txt &

3. 一個更為複雜的例子,重定向標準輸入(stdin):

nohup ./myprogram > foo.out 2> foo.err < /dev/null &

這裡多出來一個< /dev/null,意思是將標準輸入重定向到/dev/null,以確保程式不會從標準輸入中讀取任何資料。

這個是為了解決一個實際問題:SSH對談常常拒絕登出(或者掛起),因為它不願意去丟失與後臺job(s)進行互動的資料。當遇到這個問題的時候,可以使用上面的命令,通過三次重定向來解決。

nohup後臺程序管理

使用 jobs 命令可以檢視當前 shell 中後臺執行的任務列表,包括任務編號、狀態和命令。

例如,我們在後臺執行一個sleep 1000命令,使用jobs命令檢視:

$ jobs
[1]+  Running                 nohup sleep 1000 &

其中,方括號中的數位表示任務編號,加號或減號表示任務的優先順序,Running 表示任務正在後臺執行。除此之外,還有其他可能的狀態,包括 Stopped(已停止)、Done(已完成)等。

我們還可以使用 fg 命令將一個後臺任務移動到前臺繼續執行,例如:

$ fg %1

這個命令會將任務編號為 1 的任務移動到前臺,繼續執行。如果希望將任務暫停或恢復,可以使用 Ctrl-Z 鍵,在當前 shell 中傳送 SIGTSTP 訊號。

$ fg %1
nohup sleep 1000

^Z
[1]+  Stopped                 nohup sleep 1000

此時如果想要恢復執行,可以使用bg命令:

$ bg %1
[1]+ nohup sleep 1000 &

如果想要殺死該任務,可以使用kill命令:

$ kill %1
[1]+  Terminated              nohup sleep 1000

如果你想殺死所有後臺任務,但是又覺得一個個地比較麻煩,可以使用disown命令來解決:

$ disown -a

這個命令可以殺死所有後臺任務,但不會有任何提示,你可以通過jobs命令來確認。

總結

nohup命令可以在後臺執行程式,即使終端關閉或斷開與遠端伺服器的連線也不會影響程式的執行。通過nohup命令啟動的程序會忽略所有終端訊號,因此即使使用Ctrl+C關閉終端,程序也不會停止。可以使用jobs命令檢視後臺執行的程序,並使用fg命令將程序切換到前臺執行。

nohup非常適合用來執行一些需要長時間執行的指令碼或程式,比如Web伺服器,資料庫等。但需要注意的是,nohup命令並不是完全避免了程序被中斷的可能,例如系統崩潰、程序錯誤等情況仍可能導致程序的中斷。

到此這篇關於一文帶你深入理解Linux中的nohup命令的文章就介紹到這了,更多相關Linux nohup命令內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com