python守护进程编写

来源:互联网 发布:手机和信息安全 知乎 编辑:程序博客网 时间:2024/05/05 14:45

代码如下:

#!/usr/bin/env python#coding:utf-8import osimport sysimport timeimport signaldef 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()
0 0
原创粉丝点击