如何终止使用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()时,它会成功终止

回答:

使用process group,以便能够向组中的所有进程发送信号。为此,您应该将session id附加到生成/子进程的父进程,这是您的案例中的一个shell。这将使其成为流程的组长。那么现在,当信号被发送到进程组组长时,它被传送到该组的所有子进程。
以下是代码:

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

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: How to terminate a python subprocess launched with shell=True

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 7 = 1