Python
後臺運行
關於
Python
後臺運行,查找了很多資料,配合Tornado
後端庫來實現。
首先聊一聊
Linux
中,關於後臺和前臺的問題。當前狀態下,執行了一條阻塞型命令(
apt update
或是yum update
)時,我們無法再這條命令執行的基礎上,再執行命令。當然&&
是類似於消息隊列,之前的命令完成(無論狀態)之後再執行。而後臺便是一種類似併發,可以同時執行多條指令。這此之上,可以將重定向輸出。
# -*- coding:utf-8 -*- def run(): print("run 1") import time for i in range(100): time.sleep(1) print(i) if __name__ == '__main__': run()
當我們有一個
python
文件(名字run.py
)使用
python3 run.py
的時候,這個程序將會在終端中輸出數字(1-100)的同時休息1秒。除非我們ctrl+c
終止,或者ctrl+z
移至後臺。
但是對於後端程序而言,ctrl+z
將會把程序放入後臺,並且處於暫停狀態。
-
第一種:後臺不暫停掛起方式(安利)
# 原命令 >>> python3 run.py # 在執行程序時,添加命令 >>> nohup python3 run.py > my.log &
nohup
不掛斷運行命令&
後臺運行>
將程序輸出結果重定向輸出到my.log
日誌中,若不指定日至文件,將使用默認nohup.out
直接用
./sh
文件就可以運行但是如果想後臺運行,即使關閉當前的終端也可以運行的話,需要
nohup
命令和&命令。
-
第二種:使用
python-daemon
方式pip3 install python-daemon
寫一個新的
py
文件(名字:run2)import daemon from run import run with daemon.DaemonContext(): run()
然後
python3 run2.py
-
第三種:
ctrl+z
+bg
指令# ctrl+z將前臺運行的程序放入後臺掛起 time@time:~$ python3 run.py runing 0 1 2 ^Z [1]+ 已停止 python3 run.py time@time:~$
# 使用bg %jubnum 方式繼續運行 time@time:~$ bg 1 [1]+ python3 run.py & time@time:~$ 3 4 5 6 7 8 9 10 ...
如果這樣做,那麼輸出結果將繼續佔用終端,
ctrl+z
將無法後臺運行
原因在於:
bg
指令本身是將後臺暫停的程序繼續運行,但並不是將程序本身從後臺調至前臺。所以佔用終端的不是程序本身,而是輸出結果。有一種很煩人的做法,讓當前終端都處於一種
ctrl+c
都無法終止的情況# ctrl+z將前臺運行的程序放入後臺掛起 time@time:~$ python3 run.py runing 0 1 2 ^Z [1]+ 已停止 python3 run.py du@du-GL553VD:~$
依舊這樣做,但在
bg 1
的時候,重定向輸出結果……time@time:~$ bg 1 > my.log # 或 time@time:~$ bg 1 > my.log &
除非關閉終端,讓我們肉眼無法看到……???
***請不要在有實時輸出的情況下用這種方式,不然連條命令寫都寫不了