从烧瓶中启动分离过程

时间:2016-05-23 20:21:33

标签: python flask subprocess detach

来自烧瓶的Lauch子过程并重启烧瓶也会杀死子过程。

有人知道如何从主进程中分离进程?所以,如果我杀死主进程,子进程将保持活动状态?

居:

在我打开路线的主烧瓶应用程序中,例如/ store_changes应用程序运行以下代码:

subprocess.Popen("python hdb_store_changes.py --country {0} --id_first_level {1} --threads {2} --qty {3} --username {4}".format(country.upper(),id_first_level,threads,fixedqty,username), shell=True,stdout=subprocess.PIPE)

此代码将执行另一个需要很长时间才能处理的程序...如果我重新启动烧瓶应用程序此过程也会死亡,我需要找到一种方法从主进程中分离...

由于

2 个答案:

答案 0 :(得分:0)

我采用的解决方案是使用wgwz提到的芹菜

但J.F. Sebastian的解决方案也是正确的。

答案 1 :(得分:0)

...不是很简单:

您可以将其设置在“ hdb_store_changes.py”模块的顶部

try:
    pid = os.fork()
    if pid > 0:
        # Exit first parent
        _logger.info("Exit first parent PID %d" % pid)
        sys.exit(0)
except OSError as e:
    msg = "fork_child #1 failed: %d (%s)" % (e.errno, e.strerror)
    _logger.info(msg)
    sys.exit(1)

# Decouple from parent environment
os.setsid()
os.umask(0)

# Do second fork_child
try:
    pid = os.fork()
    if pid > 0:
        # Exit from second parent; print eventual PID before exiting
        _logger.info("Daemon PID %d" % pid)
        sys.exit(0)
except OSError as e:
    _logger.info("fork_child #2 failed: %d (%s)" % (
        e.errno, e.strerror))
    sys.exit(1)
...
[...code ...]  
..
if __name__ == '__main__':
    main()

在烧瓶中设置如下功能:

def fork_child(args, env, cwd=ROOT):
    cmd = shlex.split(args)
    process = subprocess.Popen(args=cmd, stdin=None, stdout=None, stderr=None,
                               cwd=cwd, close_fds=True, env=env)
    _logger.info('detached process pid %s' % process.pid)
    return process.pid

然后将其用作

import sys
env = os.environ
env['PYTHONPATH'] = ','.join(sys.path)
fork_child(args='python3 hdb_store_changes.py', env=env, cwd=ROOT)

还必须确保代码中的所有内容正确关闭(atexit可能会有所帮助),捕获错误至关重要。 您也可以使用套接字,管道或数据库来与该进程通信

此外,每次尝试实施后都不要忘记检查僵尸,这会传播很多僵尸……

玩得开心!