先來寫一個需要一直運作的程式,比如 Flask 版的 Hello World
$ vi hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '
hello world
'
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, 程式進入暫停狀态
[1] + 74237 suspended python hello.py
此時你又可以在終端下敲其他指令了。但重新整理浏覽器,長時間沒有響應,因為程式進入暫停狀态了。
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 指令有關,suspended 那一欄表示狀态,剩下的就是指令了
bg 将程式運作在背景
直接打 bg 指令不加參數,運作的将是 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 處于運作狀态,浏覽器通路 http://你的伺服器ip:5000 正常看到 hello world,但盡管程式已經在背景運作了,終端還是有日志輸出:
127.0.0.1 - - [08/Apr/2017 14:34:52] "GET / HTTP/1.1" 200 -
這對我們的其他工作造成了幹擾,下面再讨論怎麼解決這個問題。
bg 指令還可以添加參數任務
$ bg %1
% 号後面跟着的是 jobs 指令輸出的标号
fg 将背景運作的程式調到前台
fg 和 bg 指令一樣,可以直接打 fg 将前面有 + 号的程式調到前台,也可以以 %标号的形式指定哪個程式
$ fg %2
然後 CTRL+C 退出,或者 CTRL+Z 暫停,然後 bg %2 在背景運作
使用 & 将程式放到背景
要把一個程式放在背景運作,照上面的做法,得先運作,然後 CTRL+Z 暫停,再用 bg 指令放到背景運作。使用 & 來簡化這一過程,并且使用 > 來重定向背景運作的程式在終端上的輸出。要繼續下面的操作,先用 fg 指令将
python hello.py
調到前台,然後 CTRL+C 退出運作。
重新運作
$ python hello.py > hello.log 2>&1 &
上面這條指令,> hello.log 表示将 python hello.py 在螢幕上标準的輸出重定向到了 hello.log 這個檔案,2>&1 表示将錯誤資訊重定向到标準輸出,& 号表示在背景運作。重新整理浏覽器,正常看到 'hello word',終端沒有輸出。可以使用 tail 指令加上 -f 參數追蹤 hello.log 檔案的輸出
$ tail -f hello.log
多重新整理幾次浏覽器,可以看到和之前那樣的日志輸出。
要退出運作,同樣可以使用 fg 指令,然後 CTRL+C 退出。
nohup 指令的使用
使用 bg 指令和 & 背景運作程式還有個缺點,你退出目前終端,程式也結束了。解決這一辦法的是使用 nohup 指令,例如
$ nohup python hello.py &
nohup 指令預設将輸出重定向到 nohup.out 這個檔案,可以使用 tail 指令跟蹤 nohup.out 這個檔案觀察程式的輸出
$ tail -f nohup.out
多重新整理幾次浏覽器,可以看到和之前螢幕上一樣的輸出。退出目前終端,重新整理浏覽器,還是能看到 'hello world'。
沒退出終端之前,可以使用 fg 指令将程式調到前台,然後 CTRL+C 結束。如果已經退出目前終端,下次再登入進來,可以使用 ps aux 指令找出程式的 pid, 然後用 kill 指令結束。