&符號(hào)
這兩天要在服務(wù)器端一直運(yùn)行一個(gè)Python腳本,當(dāng)然就想到了在命令后面加&符號(hào)
$ python /data/python/server.py >python.log &
說明:
1、 > 表示把標(biāo)準(zhǔn)輸出(STDOUT)重定向到 那個(gè)文件,這里重定向到了python.log
2、 & 表示在后臺(tái)執(zhí)行腳本
這樣可以到達(dá)目的,但是,我們退出shell窗口的時(shí)候,必須用exit命令來退出,否則,退出之后,該進(jìn)程也會(huì)隨著shell的消失而消失(退出、關(guān)閉)
使用nohup(not hang up)
$ nohup python /data/python/server.py > python.log3 2>&1 &
說明:
1、1是標(biāo)準(zhǔn)輸出(STDOUT)的文件描述符,2是標(biāo)準(zhǔn)錯(cuò)誤(STDERR)的文件描述符
1> python.log 簡(jiǎn)化為 > python.log,表示把標(biāo)準(zhǔn)輸出重定向到python.log這個(gè)文件
2、2>&1 表示把標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出,這里&1表示標(biāo)準(zhǔn)輸出
為什么需要將標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出的原因,是因?yàn)闃?biāo)準(zhǔn)錯(cuò)誤沒有緩沖區(qū),而STDOUT有。
這就會(huì)導(dǎo)致 commond > python.log 2> python.log 文件python.log被兩次打開,而STDOUT和 STDERR將會(huì)競(jìng)爭(zhēng)覆蓋,這肯定不是我門想要的
3、好了,我們現(xiàn)在可以直接關(guān)閉shell窗口(我用的是SecureCRT,用的比較多的還有Xshell),而不用再輸入exit這個(gè)命令來退出shell了
$ ps aux|grep python
tomener 1885 0.1 0.4 13120 4528 pts/0 S 15:48 0:00 python /data/python/server.py
tomener 1887 0.0 0.0 5980 752 pts/0 S+ 15:48 0:00 grep python
現(xiàn)在當(dāng)我們直接關(guān)閉shell窗口,再連接上服務(wù)器,查看Python的進(jìn)程,發(fā)現(xiàn)進(jìn)程還在
但是,在python運(yùn)行中卻查看不到輸出!
因?yàn)椋?/p>
python的輸出有緩沖,導(dǎo)致python.log3并不能夠馬上看到輸出。
使用-u參數(shù),使得python不啟用緩沖。
所以改正命令,就可以正常使用了
$ nohup python -u test.py > out.log 2>&1 &
nohup和&的區(qū)別
- & : 指在后臺(tái)運(yùn)行
- nohup : 不掛斷的運(yùn)行,注意并沒有后臺(tái)運(yùn)行的功能,,就是指,用nohup運(yùn)行命令可以使命令永久的執(zhí)行下去,和用戶終端沒有關(guān)系,例如我們斷開SSH連接都不會(huì)影響他的運(yùn)行,注意了nohup沒有后臺(tái)運(yùn)行的意思;&才是后臺(tái)運(yùn)行
&是指在后臺(tái)運(yùn)行,但當(dāng)用戶推出(掛起)的時(shí)候,命令自動(dòng)也跟著退出
那么,我們可以巧妙的吧他們結(jié)合起來用就是
nohup COMMAND &
這樣就能使命令永久的在后臺(tái)執(zhí)行
例如:
1.sh test.sh &
將sh test.sh任務(wù)放到后臺(tái) ,即使關(guān)閉xshell退出當(dāng)前session依然繼續(xù)運(yùn)行,但標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤信息會(huì)丟失(缺少的日志的輸出)
將sh test.sh任務(wù)放到后臺(tái) ,關(guān)閉xshell,對(duì)應(yīng)的任務(wù)也跟著停止。
-
nohup sh test.sh
將sh test.sh任務(wù)放到后臺(tái),關(guān)閉標(biāo)準(zhǔn)輸入,終端不再能夠接收任何輸入(標(biāo)準(zhǔn)輸入),重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤到當(dāng)前目錄下的nohup.out文件,即使關(guān)閉xshell退出當(dāng)前session依然繼續(xù)運(yùn)行。 -
nohup sh test.sh &
將sh test.sh任務(wù)放到后臺(tái),但是依然可以使用標(biāo)準(zhǔn)輸入,終端能夠接收任何輸入,重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤到當(dāng)前目錄下的nohup.out文件,即使關(guān)閉xshell退出當(dāng)前session依然繼續(xù)運(yùn)行。
任務(wù)前后臺(tái)的切換
shell支持作用控制,有以下命令實(shí)現(xiàn)前后臺(tái)切換:
-
command &讓進(jìn)程在后臺(tái)運(yùn)行 -
jobs查看后臺(tái)運(yùn)行的進(jìn)程 -
fg %n讓后臺(tái)運(yùn)行的進(jìn)程n到前臺(tái)來 -
bg %n讓進(jìn)程n到后臺(tái)去 -
kill %n殺死job
<font color="Crimson">PS: “n” 為jobs命令查看到的job編號(hào),不是進(jìn)程編號(hào).
fg、bg、jobs、&、ctrl + z都是跟系統(tǒng)任務(wù)有關(guān)的</font>
一、&
這個(gè)用在一個(gè)命令的最后,可以把這個(gè)命令放到后臺(tái)執(zhí)行
python test.py &
二、ctrl + z
可以將一個(gè)正在前臺(tái)執(zhí)行的命令放到后臺(tái),并且暫停
三、jobs
查看當(dāng)前有多少在后臺(tái)運(yùn)行的命令
jobs
[1]- Stopped vim ~/.bash_profile
[2]+ Stopped vim /etc/profile
四、fg
將后臺(tái)中的命令調(diào)至前臺(tái)繼續(xù)運(yùn)行
如果后臺(tái)中有多個(gè)命令,可以用 fg %jobnumber將選中的命令調(diào)出,%jobnumber是通過jobs命令查到的后臺(tái)正在執(zhí)行的命令的序號(hào)(不是pid)。
fg %1
五、bg
將一個(gè)在后臺(tái)暫停的命令,變成繼續(xù)執(zhí)行
如果后臺(tái)中有多個(gè)命令,可以用bg %jobnumber將選中的命令調(diào)出,%jobnumber是通過jobs命令查到的后臺(tái)正在執(zhí)行的命令的序號(hào)(不是pid)。
bg %1
[1]+ vim ~/.bash_profile &
[1]+ Stopped vim ~/.bash_profile
六、kill
殺死jobs中具體jobnumber
jobs
[1]+ Stopped vim ~/.bash_profile
[2]- Stopped vim /etc/profile
殺死 jobnumber=1:
kill %1
[1]+ Stopped vim ~/.bash_profile
在查詢下jobs:
jobs
[2]+ Stopped vim /etc/profile
補(bǔ)充
最近使用nohup創(chuàng)建了一個(gè)后臺(tái)進(jìn)程,默認(rèn)日志輸出到了nohup.out文件中,程序跑起來也就沒再管, 過了大約一周,發(fā)現(xiàn)硬盤空間不夠了,于是查找原因,發(fā)現(xiàn)這個(gè)nohup.out文件已經(jīng)到了70G了,導(dǎo)致硬 盤空間不足了。
解決方案 :
只輸出錯(cuò)誤信息到日志文件
nohup ./program >/dev/null 2>log &
什么信息也不要
nohup ./program >/dev/null 2>&1 &