linux上怎么把python程序丢到后台执行?
1、首先我们来写一小段小脚本,内容如下所示:
#!/usr/bin/env python
import time
with open('./test.log', 'w+') as tf:
i = 0
while True:
i = i + 1
time.sleep(1)
print(i, file=tf, flush=True)
这段脚本的内容就是,每个1s输出一个值到test.log这个文件中去。如果这个程序在后台被终结,那么test.log这个日志文件中就看不到对应的值了。

2、首先我们来看第一种方式,使用linux的后台命令&,执行方式如下所示:
python test.py &
执行结果如下所示,可以看到它生成了一个后台pid值,如下面图中所示,然后我们用ps命令查看一下,可以看到后台确实有这个进程。

3、然后我们来看一下日志输出文件,命令是:
ls test.*
可以看到目录下面确实生成了test.log这个日志文件,再用tail -f命令看一下日志输出,可以看到值确实一直在增加。如下面图中所示:

4、下面我们再来看第二种方式,使用nohup命令来执行。
使用nohup执行之前,现有kill命令将后台的test.py命令终结。命令格式是:
kill -9 pid
执行结果如下面第一张图中所示,然后使用nohup命令启动test.py程序,命令格式是:
nohup python test.py &
执行结果如下所示,同样的,也是生成一个后台进程,通过进程编号可以看到对应的进程,然后通过tail -f命令也可以看到test.log里的数值是在递增的,说明程序在后台运行正常。


1、上面两种方式都是通过linux系统自带的命令来执行的,但是我们还可以通过python自己的模块来执行,这个模块就是daemon,首先我们来安装这个模块,命令是
pip install daemon
这个模块比较小,安装的也比较快。如下所示:

2、安装完成后,我们需要将我们的测试脚本稍微修改一下,修改后的内容如下:
#!/usr/bin/env python
import time
from daemon import DaemonContext
with open('./test.log', 'w+') as tf:
def test():
i = 0
while True:
i = i + 1
time.sleep(1)
print(i, file=tf, flush=True)
with DaemonContext(files_preserve=[tf]):
test()
将原来的测试功能改成一个叫做test的函数,然后在daemon的模块里调用这个函数,这里如果要想将测试日志写入文件的把,必须先打开文件句柄,然后把文件句柄通过files_preserve参数传递给DaemonContext,否则,不会把结果输出到任何文件。

3、这个时候就简单了,直接执行命令
python test.py
然后就自动把test.py这个程序丢到后台去执行了,如下所示,然后使用tail -f命令查看,可以看到数据在递增。说明这个方法也是有效的。
