我有一个以下bash脚本:
#!/bin/bash
for i in {0..8}
do
trap "echo received $i" $i
done
trap "echo 'receiving the SIGINT'; kill -9 $$" INT
for i in {10..64}
do
trap "echo receiving the $i" $i
done
sleep 1h
如果运行它并从其他终端发送SIGINT到它,它什么都不做。
我正在使用kill -2 pid
,其中pid是正在运行的脚本的pid。
如果我在脚本运行的终端中按 CTRL + C (SIGINT),它会自行终止并写入消息。为什么从不同的终端发送信号时不一样?
答案 0 :(得分:0)
如果我用
替换sleep 1h
while true ; do
sleep 1
done
它正在运作: - )
答案 1 :(得分:0)
通常,shell会传递处理过的信号("弹出陷阱")only between commands。这意味着在孩子 sleep 进程退出之前,您的脚本的陷阱无法生效。
在 CTRL + C 案例中,the terminal sends a SIGINT to the foreground process group。该组包括 your_script.sh 及其子 sleep 1h 。子进程立即被终止,然后脚本解锁并弹出陷阱以获取它收到的信号。
在 kill -INT 的情况下,SIGINT仅传递给 your_script.sh 但不传递给其子节点,因此trap
保持待定状态孩子正常退出。这就是为什么将 sleep 间隔从1小时缩短到1秒钟的紧密循环的原因:陷阱等待的时间不超过1秒。