Linux/Unix下,通常只有守護(hù)進(jìn)程可在脫離終端的情況下能繼續(xù)執(zhí)行,而普通進(jìn)程在關(guān)閉終端時(shí)會因收到SIGHUP信號(掛起信號)而退出。當(dāng)終端退出后,由該終端啟動的后臺程序自動退出。
若想命令在后臺運(yùn)行,則可用 & 指定命令在后臺運(yùn)行;
若想終端退出后程序不停止運(yùn)行,則可用nohup命令啟動后臺程序。
nohup(=no hang up),使命令忽略SIGHUP信號;
[語法] nohup Command [ Arg ... ] [&]
[命令輸出說明]
Command 的輸出如果沒有被重定向,則無論是標(biāo)準(zhǔn)輸出(stdout),還是標(biāo)準(zhǔn)錯(cuò)誤(stderr),均重定向到nohup.out文件;nohup.out文件缺省寫在當(dāng)前目錄下,如果在該目錄下無寫權(quán)限,則試圖寫到$HOME/nohup.out中,如果仍然失敗,整個(gè)命令執(zhí)行失敗;
Command的輸出如果重定向,則寫入指定的重定向文件中;
[退出狀態(tài)]
126 能查找但不能調(diào)用 Command 命令;
127 nohup 命令發(fā)生錯(cuò)誤或找不到 Command 命令;
否則為 Command 命令的退出狀態(tài);
nohup與&的區(qū)別:
nohup只是讓命令忽略SIGHUP命令而已;
&則讓命令在后臺運(yùn)行;
至于該命令是否能在脫離終端后繼續(xù)執(zhí)行則要看進(jìn)程是否是守護(hù)進(jìn)程,如果不是,則需要nohup來幫忙;
PS,引用 http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html
---------以下為引用內(nèi)容
————————————————
nohup -- invoke a utility immune to hangups : 運(yùn)行命令忽略掛起信號
& 是指后臺運(yùn)行;
nohup 的功能和& 之間的功能并不相同。其中,nohup 可以使得命令永遠(yuǎn)運(yùn)行下去和用戶終端沒有關(guān)系。當(dāng)我們斷開ssh 連接的時(shí)候不會影響他的運(yùn)行。而& 表示后臺運(yùn)行。當(dāng)ssh 斷開連接的時(shí)候(用戶退出或掛起的時(shí)候),命令也自動退出。
當(dāng)然我們可以把兩者結(jié)合起來使用:
nohup command &
來實(shí)現(xiàn)命令的后臺運(yùn)行并且和用戶終端沒有關(guān)系。
由 nohup 文檔來看:
If the output file nohup.out cannot be created in the current directory, the nohup utility uses the directory named by HOME to create the file.
表示:nohup 命令執(zhí)行后,會產(chǎn)生日志文件,把命令的執(zhí)行中的消息報(bào)損到這個(gè)文件之中。如果當(dāng)前文件不可寫,那么會自動保存到執(zhí)行這個(gè)命令的home 目錄下面。如果是超級管理員root 對應(yīng)的是/root 目錄。
從上面對比我們發(fā)現(xiàn):
1. & 可以使得命令 免疫 ctrl c 的 SIGINT 信號,不能是的命令對 SIGHUP 信號進(jìn)行免疫。
2. nohup 可以使得命令對兩個(gè)信號都可以進(jìn)行免疫。
為了使得 & 達(dá)到相同的效果:
我們可以使用如下操作:
如果已經(jīng)使用 & 命令進(jìn)行 后臺運(yùn)行。
可以使用disown -h 讓任務(wù)忽略sighup 信號;
同樣不會因?yàn)榭刂婆_的終端而中斷任務(wù)。
展示:
斷開終端重新登錄時(shí):
這樣當(dāng)你在大量備份文件的時(shí)候,如果出現(xiàn)斷網(wǎng)或者不得不下線的時(shí)候。我們可以使用。
ctrl z 掛起任務(wù);disown-h 使得任務(wù) 忽略sighup 信號;使用 bg 命令使得命令后臺運(yùn)行。這樣就可以放心得下線了。
參考鏈接:
1. https://blog.csdn.net/zhang_Red/article/details/52789691
2. https://blog.csdn.net/stpeace/article/details/76389073
功能:不掛斷運(yùn)行命令
語法:nohup Command [ Arg … ] [ & ]
? 無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當(dāng)前目錄的 nohup.out 文件中。
如果當(dāng)前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。
如果沒有文件能創(chuàng)建或打開以用于追加,那么 Command 參數(shù)指定的命令不可調(diào)用。
退出狀態(tài):該命令返回下列出口值:
126: 可以查找但不能調(diào)用 Command 參數(shù)指定的命令。
127: nohup 命令發(fā)生錯(cuò)誤或不能查找由 Command 參數(shù)指定的命令。
否則,nohup 命令的退出狀態(tài)是 Command 參數(shù)指定命令的退出狀態(tài)。
功能:命令在后臺運(yùn)行,功能與Ctrl+z
相同,一般配合nohup一起使用
eg:nohup ~/user/test.sh>output.log 2>&1 &
命令詳解:
nohup ~/user/test.sh>output.log
不掛斷運(yùn)行test.sh
,輸出結(jié)果重定向到當(dāng)前目錄的output.log
&
表示后臺運(yùn)行2>&1
0
表示鍵盤輸入,1
屏幕輸出即標(biāo)準(zhǔn)輸出,2
表示錯(cuò)誤輸出。其中2>&1
表示將錯(cuò)誤信息重定向到標(biāo)準(zhǔn)輸出 試想一下,如果2>&1
指將錯(cuò)誤信息重定向到標(biāo)準(zhǔn)輸出,那2>1
指什么? 分別嘗試2>1
,2>&1
$ ls >outfile$ cat outlog outlogtest.sh$ ls xxx>outfilels: cannot access xxx: No such file or directory$ cat outfile (這里是空)$ ls xxx 2>1$ cat 1(可以看出,將錯(cuò)誤信息重定向到文件1里面了)ls: cannot access xxx: No such file or directory
? 也就是說2>1
會將錯(cuò)誤信息重定向到文件1里面,所以2>&1
中的&1
指標(biāo)準(zhǔn)輸出
jobs命令用于顯示Linux中的任務(wù)列表及任務(wù)狀態(tài),包括后臺運(yùn)行的任務(wù)。該命令可以顯示任務(wù)號及其對應(yīng)的進(jìn)程號。其中,任務(wù)號是以普通用戶的角度進(jìn)行的,而進(jìn)程號則是從系統(tǒng)管理員的角度來看的。一個(gè)任務(wù)可以對應(yīng)于一個(gè)或者多個(gè)進(jìn)程號。
語法: jobs(選項(xiàng))(參數(shù))
選項(xiàng)
-l:顯示進(jìn)程號; -p:僅任務(wù)對應(yīng)的顯示進(jìn)程號; -n:顯示任務(wù)狀態(tài)的變化; -r:僅輸出運(yùn)行狀態(tài)(running)的任務(wù); -s:僅輸出停止?fàn)顟B(tài)(stoped)的任務(wù)。
常用命令: jobs -l
其中,輸出信息的第一列表示任務(wù)編號,第二列表示任務(wù)所對應(yīng)的進(jìn)程號,第三列表示任務(wù)的運(yùn)行狀態(tài),第四列表示啟動任務(wù)的命令。
缺點(diǎn):jobs命令只看當(dāng)前終端生效的,關(guān)閉終端后,在另一個(gè)終端jobs已經(jīng)無法看到后臺跑得程序了,此時(shí)利用ps(進(jìn)程查看命令)
ps命令用于報(bào)告當(dāng)前系統(tǒng)的進(jìn)程狀態(tài)。可以搭配kill指令隨時(shí)中斷、刪除不必要的程序。ps命令是最基本同時(shí)也是非常強(qiáng)大的進(jìn)程查看命令,使用該命令可以確定有哪些進(jìn)程正在運(yùn)行和運(yùn)行的狀態(tài)、進(jìn)程是否結(jié)束、進(jìn)程有沒有僵死、哪些進(jìn)程占用了過多的資源等等,總之大部分信息都是可以通過執(zhí)行該命令得到的。
常用命令:ps -aux
a:顯示所有程序 u:以用戶為主的格式來顯示 x:顯示所有程序,不以終端機(jī)來區(qū)分
通常與nohup &
配合使用,用于查看后臺進(jìn)程ID 配合 kill命令殺掉程序
常用命令:ps -aux|grep test.sh| grep -v grep
注:grep -v grep
用grep -v參數(shù)可以將grep命令排除掉
https://www.cnblogs.com/laoyeye/p/9346330.html