Linux 命令的后臺運行

先來寫一個需要一直運行的程序,比如 Flask 版的 Hello World

$ vi hello.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>hello world<h1>'

if __name__ == '__main__':
    app.run(host='0.0.0.0')
$ pip install flask
$ python hello.py

啟動成功控制臺提示:

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

此時打開瀏覽器訪問 http://你的服務器ip:5000 即可看到 Hello World

CTRL+C 退出,如果想讓程序一直運行又想同時做其他事怎么辦?

CTRL+Z 暫停程序

程序在前臺運行時,按下 CRTL+Z, 程序進入暫停狀態(tài)

[1]  + 74237 suspended  python hello.py

此時你又可以在終端下敲其他命令了。但刷新瀏覽器,長時間沒有響應,因為程序進入暫停狀態(tài)了。

jobs 列出后臺運行的命令

$ jobs
[1]  - suspended  python hello.py

再來啟動一個命令,比如

$ tail -f hello.py

然后 CTRL+Z 暫停,再運行下 jobs 命令

$ jobs
[1]  - suspended  python hello.py
[2]  + suspended  tail -f hello.py

前面的[1] [2] 是任務編號,+ - 和接下來要說的 fg、bg 命令有關(guān),suspended 那一欄表示狀態(tài),剩下的就是命令了

bg 將程序運行在后臺

直接打 bg 命令不加參數(shù),運行的將是 jobs 列出的 第二列是 + 的那個程序

$ jobs
[1]  - suspended  python hello.py
[2]  + suspended  tail -f hello.py
$ bg
[2]  - 74616 continued  tail -f hello.py
$ jobs
[1]  + suspended  python hello.py
[2]  - running    tail -f hello.py

打了一次 bg 命令之后,原本是 + 的那個命令變成 running 了,同時 + 也移到了其他命令前面

$ bg
[1]  - 74237 continued  python hello.py
$ jobs
[1]  - running    python hello.py
[2]  + running    tail -f hello.py

此時看到 python hello.py 處于運行狀態(tài),瀏覽器訪問 http://你的服務器ip:5000 正??吹?hello world,但盡管程序已經(jīng)在后臺運行了,終端還是有日志輸出:

127.0.0.1 - - [08/Apr/2017 14:34:52] "GET / HTTP/1.1" 200 -

這對我們的其他工作造成了干擾,下面再討論怎么解決這個問題。

bg 命令還可以添加參數(shù)任務

$ bg %1

% 號后面跟著的是 jobs 命令輸出的標號

fg 將后臺運行的程序調(diào)到前臺

fgbg 命令一樣,可以直接打 fg 將前面有 + 號的程序調(diào)到前臺,也可以以 %標號的形式指定哪個程序

$ fg %2

然后 CTRL+C 退出,或者 CTRL+Z 暫停,然后 bg %2 在后臺運行

使用 & 將程序放到后臺

要把一個程序放在后臺運行,照上面的做法,得先運行,然后 CTRL+Z 暫停,再用 bg 命令放到后臺運行。使用 & 來簡化這一過程,并且使用 > 來重定向后臺運行的程序在終端上的輸出。要繼續(xù)下面的操作,先用 fg 命令將

python hello.py

調(diào)到前臺,然后 CTRL+C 退出運行。

重新運行

$ python hello.py > hello.log 2>&1 &

上面這條命令,> hello.log 表示將 python hello.py 在屏幕上標準的輸出重定向到了 hello.log 這個文件,2>&1 表示將錯誤信息重定向到標準輸出,& 號表示在后臺運行。刷新瀏覽器,正??吹?'hello word',終端沒有輸出??梢允褂?tail 命令加上 -f 參數(shù)追蹤 hello.log 文件的輸出

$ tail -f hello.log

多刷新幾次瀏覽器,可以看到和之前那樣的日志輸出。
要退出運行,同樣可以使用 fg 命令,然后 CTRL+C 退出。

nohup 命令的使用

使用 bg 命令和 & 后臺運行程序還有個缺點,你退出當前終端,程序也結(jié)束了。解決這一辦法的是使用 nohup 命令,例如

$ nohup python hello.py &

nohup 命令默認將輸出重定向到 nohup.out 這個文件,可以使用 tail 命令跟蹤 nohup.out 這個文件觀察程序的輸出

$ tail -f nohup.out

多刷新幾次瀏覽器,可以看到和之前屏幕上一樣的輸出。退出當前終端,刷新瀏覽器,還是能看到 'hello world'。
沒退出終端之前,可以使用 fg 命令將程序調(diào)到前臺,然后 CTRL+C 結(jié)束。如果已經(jīng)退出當前終端,下次再登錄進來,可以使用 ps aux 命令找出程序的 pid, 然后用 kill 命令結(jié)束。

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

相關(guān)閱讀更多精彩內(nèi)容

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