python 将 SIGINT 转发给子进程

python forward SIGINT to subprocess

这是一个简单的 Python 生成进程的脚本:

import subprocess
import os

subprocess.run(['ping', '-i', '30', 'google.fr'],
               preexec_fn=lambda : os.setpgrp())

当我 kill -TERM <python-pid> 时,它停止了 python 进程,但 ping 进程继续 运行:这正是我所期望的。

但是当我 kill -INT <python-pid> 时,pythonping 进程都停止了。这与 CTRL-V 不同,后者将 SIGINT 发送到进程组,而不仅仅是进程。无论如何,setpgrp 使 ping 进程成为其自身进程组的领导者。

所以我想在 Python 代码的某处,SIGINT 被发送到 ping 子级,但 SIGTERM 不是,但是这段代码在哪里,并且它在哪里记录?

编辑:我是 运行 Python Debian 9 上的 3.6。

代码在subprocess.run, the function you called. SIGINT gets converted into a KeyboardInterrupt exception, which is handled by an except clause that calls process.kill(). You could implement different handling of SIGINT using the signal模块中。值得注意的是,kill 不发送 SIGINT,而是发送 SIGKILL,因此子进程没有机会使用此默认清理执行类似的处理。