gpt4 book ai didi

python - SIGINT 对脚本没有影响

转载 作者:太空狗 更新时间:2023-10-29 12:28:05 25 4
gpt4 key购买 nike

我试图通过以两种不同方式启动的脚本来了解我对 SIGINT 信号的行为。

这是一个简单的 python 脚本:

import time
while True:
time.sleep(10000)

如果我在后台启动脚本,检查 pid 和 ppid(注意它与我的终端相同)并用 SIGINT 杀死它,它会工作:

user@host [~] > python script.py &
[1] 19077

user@host [~] > ps axo pid,ppid,command | grep script
19077 1055 python script.py
19093 1055 grep script

user@host [~] > kill -INT 19077
Traceback (most recent call last):
File "script.py", line 10, in <module>
time.sleep(10000)
KeyboardInterrupt
[1] + exit 1 python script.py

现在,如果我通过 Makefile 启动它:

user@host [~] > cat Makefile
all:
python script.py &

user@host [~] > make
python script.py &

user@host [~] > ps axo pid,ppid,command | grep script
19118 1 python script.py
19122 1055 grep script

user@host [~] > kill -INT 19118
user@host [~] > ps axo pid,ppid,command | grep script
19118 1 python script.py
19128 1055 grep script

请注意,现在它的 ppid 是 1(初始化,似乎符合逻辑)并且它没有被杀死。好像进程没有收到信号。我更改了脚本以自己处理信号:

import time, signal, sys

def signal_handler(signal, frame):
print 'Killed !'
sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)

while True:
time.sleep(10000)

现在进程被我写的处理程序杀死了:

user@host [~] > make
python script.py &
user@host [~] > ps axo pid,ppid,command | grep script
19148 1 python script.py
19152 1055 grep script
user@host [~] > kill -INT 19148
Killed !
user@host [~] > ps axo pid,ppid,command | grep script
19158 1055 grep script

所以我的问题是:当进程的 ppid 为 1 或使用 Makefile 启动时,为什么进程没有被 SIGINT 杀死?我无法理解这种行为,我知道最好的方法是用 SIGTERM 杀死它,因为它几乎就像一个守护进程,但我还是想了解这一点。

在 python 中,SIGINT 信号被转换为 KeyboardInterrupt 异常,我试图捕获它但没有成功。

我在 bash 中执行了相同的脚本,并且行为完全相同。

有什么想法吗?

最佳答案

信号处理程序是从父进程继承的,正如您自己演示的那样,可以重新定义。所以要么 make 重新定义它。或者,特别是对于 SIGINT,当进程失去其标准输入或其终端时,可能存在重新定义处理程序的逻辑,因为 SIGINT 通常用于 Ctrl-C。没有终端,没有 Ctrl-C。

关于python - SIGINT 对脚本没有影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35895432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com