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>
时,python
和 ping
进程都停止了。这与 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
,因此子进程没有机会使用此默认清理执行类似的处理。
这是一个简单的 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>
时,python
和 ping
进程都停止了。这与 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
,因此子进程没有机会使用此默认清理执行类似的处理。