首页 > 解决方案 > Python:杀死父进程后保留子进程

问题描述

我正在开发一个简单的烧瓶应用程序,并且我有一个端点,可以根据请求创建一个 bash 会话。即使我杀死烧瓶,我也希望保留该过程。

该过程已开始使用subprocess.Popen(),我希望它即使在killall python从终端执行后也能持续存在。

我尝试设置preexec_fn=os.setsidandpreexec_fn=setpgrp参数,Popen但运行killall仍然会杀死我在 Flask 应用程序中创建的 bash-shell。

相关代码:

def run_command(command):
        Process.proc = subprocess.Popen(
            command,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            universal_newlines=True,
            preexec_fn=os.setsid,
        )

run_command(['bash', '-c', 'for((i=0;i<1000;i++)); do echo $i; sleep 1; done; echo EOF'])

我会很感激任何指示。谢谢你。

标签: pythonpython-3.xlinuxprocesssubprocess

解决方案


您可能不想直接使用 Popen,而是使用文档(17.5.1)中推荐的 subprocess.run()。

# Python3.5 or above:
from subprocess import PIPE, run

def run_command(cmd:str):
    run(cmd, universal_newlines=True)

def run_piped_command(cmd:str):
    result = run(cmd, stdout=PIPE, stderr=PIPE, universal_newlines=True)
    return result.stdout, result.stderr

如果您不按照@metatoaster 的说明通过管道输出,进程将继续执行,如果您运行该killall python命令,它将输出一条很好的python: no process found消息。


推荐阅读