import sys, os, time, atexit
from signal import SIGTERM
import signal
import subprocess
class Daemon:
def __init__(self, stdin='/dev/null', stdout='/home/workspace/py_server/engine.log', stderr='/dev/null'):
self.stdin = stdin
self.stdout = stdout
self.stderr = stderr
self.child_map = {}
def _daemonize(self):
pid = os.fork()
if (pid > 0):
sys.exit(0)
os.setsid()
os.chdir('/')
os.umask(0)
sys.stdout.flush()
sys.stderr.flush()
fd0 = file(self.stdin, 'r')
fd1 = file(self.stdout, 'a+')
fd2 = file(self.stderr, 'a+', 0)
os.dup2(fd0.fileno(), sys.stdin.fileno())
os.dup2(fd1.fileno(), sys.stdout.fileno())
os.dup2(fd2.fileno(), sys.stderr.fileno())
def start(self):
self._daemonize()
signal.signal(signal.SIGCHLD, self._handle_exit)
self._run()
def _run(self):
pass
def add_child(self, pid, cmd):
for pid_,cmd_ in self.child_map.items():
if cmd_ == cmd:del(self.child_map[pid_])
self.child_map[pid] = cmd
def register_signal(self, signal_num):
signal.signal(signal_num, self.handle_signal)
def _handle_exit(self, signal_num, arg):
pid, state = os.wait()
self.handle_exit(pid, state)
def handle_exit(self, pid, state):
pass
def handle_signal(self, signal_num, arg):
pass
def spawn_child(self, cmd):
process = subprocess.Popen(cmd, shell=True)
self.add_child(process.pid, cmd)写一个数继承Daemon类,重写_run方法,在里面写你的程序体,重写handle_exit方法,子进程退出时可以回调获得退出子进程的ID和退出状态,spawn_child传入字符串命令行,启动子进程。