一文帶你深入理解Linux中的nohup命令
前言
當(dāng)我們在Linux或Unix系統(tǒng)上執(zhí)行一個(gè)長時(shí)間運(yùn)行的命令或腳本時(shí),我們通常會(huì)遇到一個(gè)問題,那就是在終端關(guān)閉或者退出后,該進(jìn)程也會(huì)隨之停止運(yùn)行。在這種情況下,我們需要一種方式來讓進(jìn)程在后臺(tái)運(yùn)行,而不受終端關(guān)閉的影響。這時(shí),nohup命令就派上用場了。
nohup是什么
nohup是Linux和Unix系統(tǒng)中的一個(gè)命令,其作用是在終端退出時(shí),讓進(jìn)程在后臺(tái)繼續(xù)運(yùn)行。它的全稱為“no hang up”,意為“不掛起”。nohup命令可以讓你在退出終端或關(guān)閉SSH連接后繼續(xù)運(yùn)行命令。
nohup語法規(guī)則
nohup命令的基本語法如下:
nohup COMMAND [ARGS ...] [> output-file 2> error-file] &
其中的參數(shù)含義如下:
COMMAND:需要在后臺(tái)運(yùn)行的命令或腳本。ARGS:命令或腳本的參數(shù)。> output-file:輸出重定向到指定的文件中。2> error-file:錯(cuò)誤信息重定向到指定的文件中。&:將命令放在后臺(tái)運(yùn)行。
nohup命令的執(zhí)行過程分為以下幾個(gè)步驟:
- nohup命令將當(dāng)前shell的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出全部重定向到
/dev/null設(shè)備中,避免被關(guān)閉終端的信號(hào)所中斷。 - nohup命令將進(jìn)程放到后臺(tái)執(zhí)行,并將進(jìn)程的PID輸出到終端。
- 進(jìn)程開始執(zhí)行,并將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到指定的文件中。
- 用戶可以退出終端或關(guān)閉終端窗口,進(jìn)程仍然在后臺(tái)運(yùn)行。
nohup使用方法
使用nohup命令非常簡單,按照上面的基本語法即可。以下是一些nohup命令的用法示例:
后臺(tái)運(yùn)行命令
要在后臺(tái)運(yùn)行命令,只需要在命令行中輸入以下命令即可:
nohup COMMAND &
例如,在后臺(tái)運(yùn)行一個(gè)Bash腳本:
nohup bash test.sh &
標(biāo)準(zhǔn)輸出重定向到文件
nohup bash test.sh > stdout.txt &
標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到文件
nohup bash test.sh 2> stderr.txt &
將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都重定向到文件
1. 重定向到同一文件
nohup bash test.sh > output.txt 2>&1 &
2. 重定向到不同文件
nohup bash test.sh > stdout.txt 2> stderr.txt &
3. 一個(gè)更為復(fù)雜的例子,重定向標(biāo)準(zhǔn)輸入(stdin):
nohup ./myprogram > foo.out 2> foo.err < /dev/null &
這里多出來一個(gè)< /dev/null,意思是將標(biāo)準(zhǔn)輸入重定向到/dev/null,以確保程序不會(huì)從標(biāo)準(zhǔn)輸入中讀取任何數(shù)據(jù)。
這個(gè)是為了解決一個(gè)實(shí)際問題:SSH會(huì)話常常拒絕注銷(或者掛起),因?yàn)樗辉敢馊G失與后臺(tái)job(s)進(jìn)行交互的數(shù)據(jù)。當(dāng)遇到這個(gè)問題的時(shí)候,可以使用上面的命令,通過三次重定向來解決。
nohup后臺(tái)進(jìn)程管理
使用 jobs 命令可以查看當(dāng)前 shell 中后臺(tái)運(yùn)行的任務(wù)列表,包括任務(wù)編號(hào)、狀態(tài)和命令。
例如,我們在后臺(tái)執(zhí)行一個(gè)sleep 1000命令,使用jobs命令查看:
$ jobs [1]+ Running nohup sleep 1000 &
其中,方括號(hào)中的數(shù)字表示任務(wù)編號(hào),加號(hào)或減號(hào)表示任務(wù)的優(yōu)先級(jí),Running 表示任務(wù)正在后臺(tái)運(yùn)行。除此之外,還有其他可能的狀態(tài),包括 Stopped(已停止)、Done(已完成)等。
我們還可以使用 fg 命令將一個(gè)后臺(tái)任務(wù)移動(dòng)到前臺(tái)繼續(xù)運(yùn)行,例如:
$ fg %1
這個(gè)命令會(huì)將任務(wù)編號(hào)為 1 的任務(wù)移動(dòng)到前臺(tái),繼續(xù)執(zhí)行。如果希望將任務(wù)暫?;蚧謴?fù),可以使用 Ctrl-Z 鍵,在當(dāng)前 shell 中發(fā)送 SIGTSTP 信號(hào)。
$ fg %1 nohup sleep 1000 ^Z [1]+ Stopped nohup sleep 1000
此時(shí)如果想要恢復(fù)運(yùn)行,可以使用bg命令:
$ bg %1 [1]+ nohup sleep 1000 &
如果想要?dú)⑺涝撊蝿?wù),可以使用kill命令:
$ kill %1 [1]+ Terminated nohup sleep 1000
如果你想殺死所有后臺(tái)任務(wù),但是又覺得一個(gè)個(gè)地比較麻煩,可以使用disown命令來解決:
$ disown -a
這個(gè)命令可以殺死所有后臺(tái)任務(wù),但不會(huì)有任何提示,你可以通過jobs命令來確認(rèn)。
總結(jié)
nohup命令可以在后臺(tái)運(yùn)行程序,即使終端關(guān)閉或斷開與遠(yuǎn)程服務(wù)器的連接也不會(huì)影響程序的運(yùn)行。通過nohup命令啟動(dòng)的進(jìn)程會(huì)忽略所有終端信號(hào),因此即使使用Ctrl+C關(guān)閉終端,進(jìn)程也不會(huì)停止??梢允褂?code>jobs命令查看后臺(tái)運(yùn)行的進(jìn)程,并使用fg命令將進(jìn)程切換到前臺(tái)運(yùn)行。
nohup非常適合用來執(zhí)行一些需要長時(shí)間運(yùn)行的腳本或程序,比如Web服務(wù)器,數(shù)據(jù)庫等。但需要注意的是,nohup命令并不是完全避免了進(jìn)程被中斷的可能,例如系統(tǒng)崩潰、進(jìn)程錯(cuò)誤等情況仍可能導(dǎo)致進(jìn)程的中斷。
到此這篇關(guān)于一文帶你深入理解Linux中的nohup命令的文章就介紹到這了,更多相關(guān)Linux nohup命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ubuntu下安裝rsh實(shí)現(xiàn)無密碼訪問詳解
這篇文章主要為大家詳細(xì)介紹了Ubuntu下安裝rsh實(shí)現(xiàn)無密碼訪問的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Linux kde中11個(gè)你不知道的應(yīng)用程序
今天小編就為大家分享一篇關(guān)于Linux kde中11個(gè)你不知道的應(yīng)用程序,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10
科普Solaris系統(tǒng)安全常用命令小結(jié)
Solaris系統(tǒng)下維護(hù)密碼和登錄控制 監(jiān)控系統(tǒng)使用情況 限制文件訪問 root用戶登錄 控制通過網(wǎng)絡(luò)的遠(yuǎn)程訪問2008-06-06
Nginx出現(xiàn)500 Internal Server Error 錯(cuò)誤的解決方案
這篇文章主要介紹了Nginx出現(xiàn)500 Internal Server Error 錯(cuò)誤的解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
CentOS 7.x編譯安裝Nginx1.10.3+MySQL5.7.16+PHP5.2 5.3 5.4 5.5 5.6
這篇文章主要介紹了CentOS 7.x編譯安裝Nginx1.10.3+MySQL5.7.16+PHP5.2 5.3 5.4 5.5 5.6 7.0 7.1多版本全能環(huán)境,需要的朋友可以參考下2018-01-01
Linux系統(tǒng)之service創(chuàng)建方式
Linux下創(chuàng)建service的方法:1.創(chuàng)建一個(gè)新的service文件在/etc/systemd/system目錄中,2.編寫service文件的內(nèi)容,包括Description、After、ExecStart、User、Group、Restart和WantedBy,3.啟用service,使用命令systemctl enable2024-11-11

