我使用以下命令启动子进程:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
但是,当我尝试使用以下命令杀死时:
p.terminate()
or
p.kill()
该命令一直在后台运行,所以我想知道如何真正终止该进程。
请注意,当我运行命令时:
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
它在发出以下命令时确实成功终止p.terminate()
.
Use a 进程组 http://en.wikipedia.org/wiki/Process_group以便能够向组中的所有进程发送信号。为此,您应该附加一个会话ID http://pubs.opengroup.org/onlinepubs/009695399/functions/setsid.html到生成/子进程的父进程,在您的情况下是一个 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)