gpt4 book ai didi

python - 当父进程死亡时,如何杀死使用 subprocess.check_output() 创建的 python 子进程?

转载 作者:IT老高 更新时间:2023-10-28 22:14:54 27 4
gpt4 key购买 nike

我在 linux 机器上运行一个 python 脚本,它使用 subprocess.check_output() 创建一个子进程,如下所示:

subprocess.check_output(["ls", "-l"], stderr=subprocess.STDOUT)

问题是即使父进程死了,子进程仍在运行。当父进程死亡时,有什么方法可以杀死子进程?

最佳答案

是的,您可以通过两种方法实现这一点。它们都要求您使用 Popen 而不是 check_output。第一种是比较简单的方法,使用try..finally,如下:

from contextlib import contextmanager

@contextmanager
def run_and_terminate_process(*args, **kwargs):
try:
p = subprocess.Popen(*args, **kwargs)
yield p
finally:
p.terminate() # send sigterm, or ...
p.kill() # send sigkill

def main():
with run_and_terminate_process(args) as running_proc:
# Your code here, such as running_proc.stdout.readline()

这将捕获 sigint(键盘中断)和 sigterm,但不会捕获 sigkill(如果您使用 -9 终止脚本)。

另一种方法稍微复杂一些,使用 ctypes 的 prctl PR_SET_PDEATHSIG。一旦 parent 出于任何原因(甚至是sigkill)退出,系统将向 child 发送信号。

import signal
import ctypes
libc = ctypes.CDLL("libc.so.6")
def set_pdeathsig(sig = signal.SIGTERM):
def callable():
return libc.prctl(1, sig)
return callable
p = subprocess.Popen(args, preexec_fn = set_pdeathsig(signal.SIGTERM))

关于python - 当父进程死亡时,如何杀死使用 subprocess.check_output() 创建的 python 子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19447603/

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