python - Python:杀死父进程后保留子进程
问题描述
我正在开发一个简单的烧瓶应用程序,并且我有一个端点,可以根据请求创建一个 bash 会话。即使我杀死烧瓶,我也希望保留该过程。
该过程已开始使用subprocess.Popen()
,我希望它即使在killall python
从终端执行后也能持续存在。
我尝试设置preexec_fn=os.setsid
andpreexec_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'])
我会很感激任何指示。谢谢你。
解决方案
您可能不想直接使用 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
消息。
推荐阅读
- php - 主页帮助 laravel
- c# - 无法访问静态变量
- ffmpeg - 暂停 ffmpeg 流
- objective-c - 为什么@objc 会生成保留和释放调用?
- sql - 显示今天的日期和月份的名称,以小写形式显示 4 个月后的月份(即今天的日期 + 4 个月)
- elasticsearch - do we need to create index specifically in elasticsearch?
- r - 如果 R 中的语句给出了奇怪的结果
- python - 熊猫,查找和删除行
- xml - 如何在 xsl:for-each 中使用 concat() 和 position() 构建 XPath
- c++ - 在头文件中从第三方库声明变量