代码如下:
#!/usr/bin/env python
#coding:utf-8
import os
import sys
import time
import signal
def create_daemon(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
# 忽略终端I/O信号,STOP信号
signal.signal(signal.SIGTTOU, signal.SIG_IGN)
signal.signal(signal.SIGTTIN, signal.SIG_IGN)
signal.signal(signal.SIGTSTP, signal.SIG_IGN)
signal.signal(signal.SIGHUP, signal.SIG_IGN)
# 结束父进程,使得子进程成为后台进程
try:
if os.fork() > 0:
sys.exit(0)
except OSError, error:
print 'fork #1 failed: %d (%s)' % (error.errno, error.strerror)
sys.exit(1)
# 建立一个新的进程组,在这个新的进程组中,子进程成为这个进程组的首进程,以使该进程脱离所有终端
os.setsid()
# 再次新建一个子进程,退出父进程,保证该进程不是进程组长,同时让该进程无法再打开一个新的终端
try:
pid = os.fork()
if pid > 0:
print 'Daemon PID %d' % pid
sys.exit(0)
except OSError, error:
print 'fork #2 failed: %d (%s)' % (error.errno, error.strerror)
sys.exit(1)
for f in sys.stdout, sys.stderr: f.flush()
MAXFD = os.sysconf('SC_OPEN_MAX')
for i in xrange(3, MAXFD):
try:
os.close(i)
except:
pass
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())
# 改变工作目录,使得进程不与任何文件系统联系
os.chdir('/')
# 将文件屏蔽字设置为0
os.umask(0)
# 忽略SIGCHLD信号
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
run_daemon()
def run_daemon():
fd = open('/tmp/daemon.log', 'w')
while True:
fd.write(time.ctime() + '\n')
fd.flush()
time.sleep(2)
fd.close()
if __name__ == '__main__':
create_daemon()