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 &
除非关闭终端,让我们肉眼无法看到……???
***请不要在有实时输出的情况下用这种方式,不然连条命令写都写不了