python创建守护进程的疑问
天蓬老师
天蓬老师 2017-04-17 17:53:09
[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函数里呢?

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(1)
ringa_lee

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号