一、nohup
- 用途:運(yùn)行命令,忽略掛起信號(hào)(不掛斷的運(yùn)行命令,即永久執(zhí)行)。
運(yùn)行 nohup --help
Run COMMAND, ignoring hangup signals. 可以看到是“運(yùn)行命令,忽略掛起信號(hào)”
就是指,用nohup運(yùn)行命令可以使命令永久的執(zhí)行下去,和用戶(hù)終端沒(méi)有關(guān)系,例如我們斷開(kāi)SSH連接都不會(huì)影響他的運(yùn)行,注意了nohup沒(méi)有后臺(tái)運(yùn)行的意思;&才是后臺(tái)運(yùn)行
- 語(yǔ)法:nohup Command [Arg ...] [ &]
無(wú)論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當(dāng)前目錄的 nohup.out 文件中。
如果當(dāng)前目錄的 nohup.out 文件不可寫(xiě),輸出重定向到 $HOME/nohup.out 文件中。
如果沒(méi)有文件能創(chuàng)建或打開(kāi)以用于追加,那么 Command 參數(shù)指定的命令不可調(diào)用。
- 退出狀態(tài):該命令返回下列出口值:
126 可以查找但不能調(diào)用 Command 參數(shù)指定的命令。
127 nohup 命令發(fā)生錯(cuò)誤或不能查找由 Command 參數(shù)指定的命令。
否則,nohup 命令的退出狀態(tài)是 Command 參數(shù)指定命令的退出狀態(tài)。
二、&
- 用途:在后臺(tái)運(yùn)行。&是指在后臺(tái)運(yùn)行,但當(dāng)用戶(hù)推出(掛起)的時(shí)候,命令自動(dòng)也跟著退出
那么,我們可以巧妙的吧他們結(jié)合起來(lái)用就是
nohup COMMAND &
這樣就能使命令永久的在后臺(tái)執(zhí)行
舉個(gè)例子nohup tail -f nohup.out
然后退出登錄,再連接,用ps -ef 你會(huì)還能看到在運(yùn)行
ps -ef
root 3457 1 0 18:20 ? 00:00:00 tail -f nohup.out
另外,nohup執(zhí)行后,會(huì)產(chǎn)生日志文件nohup.out,把命令執(zhí)行中的消息保存到這個(gè)文件中,一般在當(dāng)前目錄下,如果當(dāng)前目錄的nohup.out文件不可寫(xiě),那么自動(dòng)保存到執(zhí)行這個(gè)命令的用戶(hù)的home目錄下,即輸出重定向到 $HOME/nohup.out 文件中,例如root的話就保存在/root/下
這個(gè)我們常在運(yùn)行命令和腳本中常用到的
nohup 應(yīng)對(duì)的就是突然斷網(wǎng)或者關(guān)閉終端時(shí)屏蔽發(fā)送給后臺(tái)任務(wù)的 SIGHUP 信號(hào)進(jìn)而使任務(wù)不中斷繼續(xù)運(yùn)行。
exit 或者 logout 命令正常退出的話根本用不著 nohup,你的 & 運(yùn)行的命令都不會(huì)被中斷。不信你可以 command & 后 exit,再次登錄,ps 查看一下命令肯定還在后臺(tái)跑。
簡(jiǎn)單來(lái)說(shuō),如果你使用的是 exit 或者 logout 命令正常登出,系統(tǒng)只會(huì)向前臺(tái)任務(wù)發(fā)送 SIGHUP 信號(hào),& 到后臺(tái)的任務(wù)時(shí)不會(huì)收到 SIGHUP 信號(hào)的。如果你強(qiáng)行關(guān)閉的窗口或者斷網(wǎng)了,系統(tǒng)會(huì)向你的前后臺(tái)任務(wù)都發(fā)送 SIGHUP 信號(hào),此時(shí)如果使用了 nohup 去運(yùn)行任務(wù),nohup 會(huì)屏蔽 SIGHUP 信號(hào),任務(wù)也就不會(huì)被中斷了。
三、Linux nohup、&、 2>&1是什么?
基本含義
/dev/null 表示空設(shè)備文件
0 表示stdin標(biāo)準(zhǔn)輸入
1 表示stdout標(biāo)準(zhǔn)輸出
2 表示stderr標(biāo)準(zhǔn)錯(cuò)誤
file 表示將標(biāo)準(zhǔn)輸出輸出到file中,也就相當(dāng)于 1>file
2> error 表示將錯(cuò)誤輸出到error文件中
2>&1 也就表示將錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出上
2>&1 >file :錯(cuò)誤輸出到終端,標(biāo)準(zhǔn)輸出重定向到文件file,等于 > file 2>&1(標(biāo)準(zhǔn)輸出重定向到文件,錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出)。
& 放在命令到結(jié)尾,表示后臺(tái)運(yùn)行,防止終端一直被某個(gè)進(jìn)程占用,這樣終端可以執(zhí)行別到任務(wù),配合 >file 2>&1可以將log保存到某個(gè)文件中,但如果終端關(guān)閉,則進(jìn)程也停止運(yùn)行。如 command > file.log 2>&1 & 。
nohup放在命令的開(kāi)頭,表示不掛起(no hang up),也即,關(guān)閉終端或者退出某個(gè)賬號(hào),進(jìn)程也繼續(xù)保持運(yùn)行狀態(tài),一般配合&符號(hào)一起使用。如nohup command &。