linux 下后臺運行python腳本

&符號

這兩天要在服務(wù)器端一直運行一個Python腳本,當(dāng)然就想到了在命令后面加&符號

$ python /data/python/server.py >python.log &


說明:

1、 > 表示把標(biāo)準(zhǔn)輸出(STDOUT)重定向到 那個文件,這里重定向到了python.log
2、 & 表示在后臺執(zhí)行腳本
這樣可以到達目的,但是,我們退出shell窗口的時候,必須用exit命令來退出,否則,退出之后,該進程也會隨著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)錯誤(STDERR)的文件描述符
1> python.log 簡化為 > python.log,表示把標(biāo)準(zhǔn)輸出重定向到python.log這個文件
2、2>&1 表示把標(biāo)準(zhǔn)錯誤重定向到標(biāo)準(zhǔn)輸出,這里&1表示標(biāo)準(zhǔn)輸出
為什么需要將標(biāo)準(zhǔn)錯誤重定向到標(biāo)準(zhǔn)輸出的原因,是因為標(biāo)準(zhǔn)錯誤沒有緩沖區(qū),而STDOUT有。
這就會導(dǎo)致 commond > python.log 2> python.log 文件python.log被兩次打開,而STDOUT和 STDERR將會競爭覆蓋,這肯定不是我門想要的
3、好了,我們現(xiàn)在可以直接關(guān)閉shell窗口(我用的是SecureCRT,用的比較多的還有Xshell),而不用再輸入exit這個命令來退出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的進程,發(fā)現(xiàn)進程還在

但是,在python運行中卻查看不到輸出!

因為:

python的輸出有緩沖,導(dǎo)致python.log3并不能夠馬上看到輸出。

使用-u參數(shù),使得python不啟用緩沖。

所以改正命令,就可以正常使用了

$ nohup python -u test.py > out.log 2>&1 &

nohup和&的區(qū)別

  • & : 指在后臺運行
  • nohup : 不掛斷的運行,注意并沒有后臺運行的功能,,就是指,用nohup運行命令可以使命令永久的執(zhí)行下去,和用戶終端沒有關(guān)系,例如我們斷開SSH連接都不會影響他的運行,注意了nohup沒有后臺運行的意思;&才是后臺運行

&是指在后臺運行,但當(dāng)用戶推出(掛起)的時候,命令自動也跟著退出

那么,我們可以巧妙的吧他們結(jié)合起來用就是

nohup COMMAND &

這樣就能使命令永久的在后臺執(zhí)行

例如:

1.sh test.sh &

將sh test.sh任務(wù)放到后臺 ,即使關(guān)閉xshell退出當(dāng)前session依然繼續(xù)運行,但標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤信息會丟失(缺少的日志的輸出)

將sh test.sh任務(wù)放到后臺 ,關(guān)閉xshell,對應(yīng)的任務(wù)也跟著停止。

  1. nohup sh test.sh

    將sh test.sh任務(wù)放到后臺,關(guān)閉標(biāo)準(zhǔn)輸入,終端不再能夠接收任何輸入(標(biāo)準(zhǔn)輸入),重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤到當(dāng)前目錄下的nohup.out文件,即使關(guān)閉xshell退出當(dāng)前session依然繼續(xù)運行。
  2. nohup sh test.sh &

    sh test.sh任務(wù)放到后臺,但是依然可以使用標(biāo)準(zhǔn)輸入,終端能夠接收任何輸入,重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤到當(dāng)前目錄下的nohup.out文件,即使關(guān)閉xshell退出當(dāng)前session依然繼續(xù)運行。

任務(wù)前后臺的切換

shell支持作用控制,有以下命令實現(xiàn)前后臺切換:

  1. command &讓進程在后臺運行
  2. jobs 查看后臺運行的進程
  3. fg %n 讓后臺運行的進程n到前臺來
  4. bg %n 讓進程n到后臺去
  5. kill %n 殺死job

    <font color="Crimson">PS: “n” 為jobs命令查看到的job編號,不是進程編號.
      fg、bg、jobs、&ctrl + z 都是跟系統(tǒng)任務(wù)有關(guān)的</font>

一、&

這個用在一個命令的最后,可以把這個命令放到后臺執(zhí)行

python test.py &

二、ctrl + z

可以將一個正在前臺執(zhí)行的命令放到后臺,并且暫停

三、jobs

查看當(dāng)前有多少在后臺運行的命令

jobs
[1]-  Stopped                 vim ~/.bash_profile
[2]+  Stopped                 vim /etc/profile

四、fg

將后臺中的命令調(diào)至前臺繼續(xù)運行
如果后臺中有多個命令,可以用 fg %jobnumber將選中的命令調(diào)出,%jobnumber是通過jobs命令查到的后臺正在執(zhí)行的命令的序號(不是pid)。

fg %1

五、bg

將一個在后臺暫停的命令,變成繼續(xù)執(zhí)行
如果后臺中有多個命令,可以用bg %jobnumber將選中的命令調(diào)出,%jobnumber是通過jobs命令查到的后臺正在執(zhí)行的命令的序號(不是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

補充

最近使用nohup創(chuàng)建了一個后臺進程,默認日志輸出到了nohup.out文件中,程序跑起來也就沒再管, 過了大約一周,發(fā)現(xiàn)硬盤空間不夠了,于是查找原因,發(fā)現(xiàn)這個nohup.out文件已經(jīng)到了70G了,導(dǎo)致硬 盤空間不足了。
解決方案 :

只輸出錯誤信息到日志文件

nohup ./program >/dev/null 2>log &

什么信息也不要

nohup ./program >/dev/null 2>&1 &

部分內(nèi)容抄襲此博文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容