gpt4 book ai didi

python - 在不留下孤儿的情况下从 python/bash 中杀死子进程

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:02 24 4
gpt4 key购买 nike

我有一个包含 3 个主要组件的系统(一切都在 Ubuntu14.04 和 Python 2.7 上运行,不太关心可移植性):

a) 一些执行的二进制文件,我们称它为 runtime,它将一些值写入 stdoutstderr 我需要从中读取(三)

b) 设置环境并执行运行时的启动器脚本,我们称它为launcher,它看起来像这样:

#!/bin/bash

#Needed by the runtime
export SOME_VAR=1234
source some_file.sh
#...
exec runtime --option1 $1 --option2 $2

c) 服务器,它处理远程请求并在远程客户端请求它时调用launcher。服务器是用 python 编写的,需要从 (a) 中读取 stdX。我正在使用子进程模块调用 launcher:

# When calling the launcher script:
cmd = "launcher value1 value2"
p = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=True)
# read p.stdout ...

这会创建 2 个新进程,一个用于 launcher 脚本(例如 pid:10000),另一个用于 runtime(例如 pid:10001),运行 htoptree 显示类似于此的内容:

PID    ...  Command
12345 ... python server.py
10000 ... |- /bin/sh -c ./launcher value1 value2
10001 ... |- runtime --option1 value1 --option2 value2

在某些时候,服务器想要停止runtime进程(通过发送SIGTERM)

# When trying to stop the runtime:
os.kill(p.pid, signal.SIGTERM)
# Have also tried with p.terminate(), same results.

问题是这只会终止 launcher 进程 (pid:10000),让 runtime 无限期地执行。我想在 server 请求它时将 SIGTERM 正确传播到 runtime(runtime 必须接收此信号以优雅地停止并退出,否则会产生数据损坏)。

我试过使用 os.killpg(...) 杀死整个进程组,但它也杀死了 server(很明显)。

如何将 SIGTERM 信号正确传播到子进程?

最佳答案

这样使用进程组:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
shell=True, preexec_fn=os.setpgrp)

os.killpg(os.getpgid(p.pid), signal.SIGTERM)

关于python - 在不留下孤儿的情况下从 python/bash 中杀死子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39420683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com