首页 > python创建守护进程的疑问

python创建守护进程的疑问

我自己写了一个简易的下载和文件执行的客户端,如下

"""
省略若干代码
"""
#执行下载函数
def do_script():
    """Start working"""
    script_list = None
    for mark in range(3):
        try:
            # get scripts
            if not script_list:
                script_list = get_scripts()
            if script_list == None:
                continue
            for script in script_list:
                command_exec = 'chmod a+x %s' % script
                PyShell.new_progress(command_exec)
                PyShell.new_progress('./%s' % script)
                # return
        except Exception as e:
            logging.info(traceback.format_exc())
            if mark == 2:
                send_error_log(e)

#创建守护进程

def createDaemon():
    try:
        if os.fork() > 0: os._exit(0)
    except OSError, error:
        print 'fork #1 failed: %d (%s)' % (error.errno, error.strerror)
        os._exit(1)

    os.chdir('/')
    os.setsid()
    os.umask(0)

    try:
        pid = os.fork()
        if pid > 0:
            #print 'Daemon PID %d' % pid
            os._exit(0)
    except OSError, error:
        #print 'fork #2 failed: %d (%s)' % (error.errno, error.strerror)
        os._exit(1)

    sys.stdout.flush()
    sys.stderr.flush()
    si = file("/dev/null", 'r')
    so = file("/dev/null", 'a+')
    se = file("/dev/null", 'a+', 0)
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())
    #写pid文件
    if os.path.exists(pidfile):
        os.remove(pidfile)
    pid = str(os.getpid())
    file(pidfile, 'w+').write("%s\n" % pid)
    
   #为什么执行函数不能写这里,写这里会导致代码无法执行到这里?


if __name__ == '__main__':
    if platform.system() == "Linux":
        createDaemon()
        #必须写到main里,才可以执行?
        while 1:
            do_script()
            time.sleep(20)
    else:
        os._exit(0)

其中,为什么执行函数不能写在守护进程函数里,而必须写到main函数里呢?

难道是因为守护进程函数里无法再创建进程原因?


创建完Daemon进程之后,当前的进程已经不是你main入口时调用的进程了,而是一个父进程为1号进程的进程,这也是createDaemon为啥fork两次的原因。
从代码逻辑上看,createDaemon的作用就是创建一个后台进程,同时将当前进程退出,成功之后,后面的逻辑才是do_script,所以无论从可读性还是功能划分上,你贴出来的代码都是对的。
至于为啥fork两次,建议看下经典的APUE吧,这里面有说明
http://www.cnblogs.com/Anker/archive/2012/12/20/2825929.html

【热门文章】
【热门文章】