小葫芦2017-04-18 10:08:121楼
虽然你将进程放在后台执行,但是并没有跟启动该进程的终端detach,因此,父进程shell终端关闭,子进程也将被关闭。
解决方案1,可以参考How to make a Python script run like a service or daemon in Linux,教你如何在linux下编程将进程做成daemon进程。示例程序比较长,我放在最后讲解吧。
解决方案2,有python库可以将自身进程daemon化,而且挺多的。比如,python-daemon。使用示例如下:
import daemon
def do_main_program():
pass # 你的程序
with daemon.DaemonContext():
do_main_program()
补充解决方案1的处理:
# -*- coding: utf-8 -*-
import os
import sys
import datetime
def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
try:
pid = os.fork()
if pid > 0:
sys.exit(0) # Exit first parent.
except OSError, e:
sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
sys.exit(1)
# Decouple from parent environment.
os.chdir("/")
os.umask(0)
os.setsid()
# Do second fork.
try:
pid = os.fork()
if pid > 0:
sys.exit(0) # Exit second parent.
except OSError, e:
sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
sys.exit(1)
# Redirect standard file descriptors.
si = file(stdin, 'r')
so = file(stdout, 'a+')
se = file(stderr, 'a+', 0)
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
if __name__ == "__main__":
daemonize()
# 然后开始执行你的其他程序。