【发布时间】:2020-06-02 09:11:58
【问题描述】:
我正在开发一个简单的烧瓶应用程序,并且我有一个端点,可以根据请求创建一个 bash 会话。即使我杀死烧瓶,我也希望保留该过程。
该过程使用subprocess.Popen() 启动,我希望它即使在从终端执行killall python 后仍然存在。
我尝试在 Popen 上设置 preexec_fn=os.setsid 和 preexec_fn=setpgrp 参数,但运行 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'])
我将不胜感激任何指针。谢谢。
【问题讨论】:
-
您可能希望引用this thread,因为默认情况下,当父进程被杀死时,子进程不会退出,但是您有
stdout和stderr被管道返回给父进程,所以当父进程被杀死,子进程,管道的另一端死了,也死了。如果去掉stdout和stderr参数,你会发现程序在调用Popen后立即退出,而bash会继续执行,并在终端回显数字。
标签: python python-3.x linux process subprocess