如何终止以shell = True启动的python子进程

我正在使用以下命令启动子流程:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)

但是,当我尝试杀死使用:

p.terminate()

要么

p.kill()

该命令一直在后台运行,所以我想知道如何才能真正终止该过程。

请注意,当我使用以下命令运行命令时:

p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)

发出时,它确实成功终止p.terminate()

回答:

使用进程组,以便能够向组中的所有进程发送信号。为此,您应该将会话ID附加到生成的子进程的父进程中,在您的情况下这是一个外壳程序。这将使其成为流程的组长。因此,现在,当信号发送到流程组负责人时,它将被传输到该组的所有子流程。

这是代码:

import os

import signal

import subprocess

# The os.setsid() is passed in the argument preexec_fn so

# it's run after the fork() and before exec() to run the shell.

pro = subprocess.Popen(cmd, stdout=subprocess.PIPE,

shell=True, preexec_fn=os.setsid)

os.killpg(os.getpgid(pro.pid), signal.SIGTERM) # Send the signal to all the process groups

以上是 如何终止以shell = True启动的python子进程 的全部内容, 来源链接: utcz.com/qa/407793.html

回到顶部