如何使用 Python 子进程终止进程组
how to kill a process group using Python subprocess
我正在尝试使用 Python 子进程执行以下等效操作:
>cat /var/log/dmesg | festival --tts &
[1] 30875
>kill -9 -30875
请注意,我正在终止进程 group(如进程 ID 号前面的负号所示)以终止 Festival 启动的所有子进程。
在Python中,我目前有以下代码,其中创建了两个进程并通过管道链接。
process_cat = subprocess.Popen([
"cat",
"/var/log/dmesg"
], stdout = subprocess.PIPE)
process_Festival = subprocess.Popen([
"festival",
"--tts"
], stdin = process_cat.stdout, stdout = subprocess.PIPE)
我应该如何以等同于上面显示的 Bash 方式终止这些进程及其子进程?以下方法是不够的,因为它不会杀死子进程:
os.kill(process_cat.pid, signal.SIGKILL)
os.kill(process_Festival.pid, signal.SIGKILL)
是否有更优雅的方法来做到这一点,也许只使用一个过程?
您可以大大简化它,因为您很少需要 cat |
。例如:
process_Festival = subprocess.Popen(["festival", "--tts", "/var/log/dmesg"])
然后
process_Festival.send_signal(1)
如果你用 SIGHUP 之类的信号而不是 SIGKILL 来结束节日
将正确清理任何子进程。
how to create a new process group with python subprocess 有很好的解释。添加选项 preexec_fn=os.setsid
到 Popen:
process_Festival = subprocess.Popen(["festival", "--tts", "/var/log/dmesg"],preexec_fn=os.setsid)
然后您可以从进程 ID 中获取进程组并向其发送信号:
pgrp = os.getpgid(process_Festival.pid)
os.killpg(pgrp, signal.SIGINT)
注意:由于 Python 3.2 您还可以在 Popen
调用中使用 start_new_session=True
而不是 preexec_fn
。
我正在尝试使用 Python 子进程执行以下等效操作:
>cat /var/log/dmesg | festival --tts &
[1] 30875
>kill -9 -30875
请注意,我正在终止进程 group(如进程 ID 号前面的负号所示)以终止 Festival 启动的所有子进程。
在Python中,我目前有以下代码,其中创建了两个进程并通过管道链接。
process_cat = subprocess.Popen([
"cat",
"/var/log/dmesg"
], stdout = subprocess.PIPE)
process_Festival = subprocess.Popen([
"festival",
"--tts"
], stdin = process_cat.stdout, stdout = subprocess.PIPE)
我应该如何以等同于上面显示的 Bash 方式终止这些进程及其子进程?以下方法是不够的,因为它不会杀死子进程:
os.kill(process_cat.pid, signal.SIGKILL)
os.kill(process_Festival.pid, signal.SIGKILL)
是否有更优雅的方法来做到这一点,也许只使用一个过程?
您可以大大简化它,因为您很少需要 cat |
。例如:
process_Festival = subprocess.Popen(["festival", "--tts", "/var/log/dmesg"])
然后
process_Festival.send_signal(1)
如果你用 SIGHUP 之类的信号而不是 SIGKILL 来结束节日 将正确清理任何子进程。
how to create a new process group with python subprocess 有很好的解释。添加选项 preexec_fn=os.setsid
到 Popen:
process_Festival = subprocess.Popen(["festival", "--tts", "/var/log/dmesg"],preexec_fn=os.setsid)
然后您可以从进程 ID 中获取进程组并向其发送信号:
pgrp = os.getpgid(process_Festival.pid)
os.killpg(pgrp, signal.SIGINT)
注意:由于 Python 3.2 您还可以在 Popen
调用中使用 start_new_session=True
而不是 preexec_fn
。