前言#
當我們在 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
命令並不是完全避免了進程被中斷的可能,例如系統崩潰、進程錯誤等情況仍可能導致進程的中斷。
參考#
https://en.wikipedia.org/wiki/Nohup
歡迎訪問我的個人博客:方寸之間