先來寫一個需要一直運行的程序,比如 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)到前臺
fg 和 bg 命令一樣,可以直接打 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é)束。