天天看點

linux+背景運作指令&,Linux 指令的背景運作hello world'

先來寫一個需要一直運作的程式,比如 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 指令結束。