我在玩 bash 和信号处理程序时发现了一件有趣的事情。但我无法解释为什么会这样。
例如,我们有一个脚本 test.sh,它可以做一些事情并且可以处理 SIGTERM:
trap 'echo "sig 15 rcvd" ' 15
trap 'echo "sig 10 rcvd" ' 10
while true
do
; do something
sleep 0.2
done
所以,当我向这个脚本发送一些信号时:
kill -15 <pidof test.sh>; kill -10 <pidof test.sh>
我收到的信号 10 比信号 15 早:
sig 10 rcvd
sig 15 rcvd
如果我发送 2 次信号 10 或 15 脚本只打印一次:
kill -15 <pidof test.sh>; kill -15 <pidof test.sh>
sig 15 rcvd
这也很奇怪:我认为这是因为我们对同一个 pid 有双重信号,并且只会向它发送一个信号。还是有其他一些原因导致这种行为?
最后一件有趣的事情:从脚本中删除 sleep 并发送两个信号:
test.sh
trap 'echo "sig 15 rcvd" ' 15
trap 'echo "sig 10 rcvd" ' 10
while true
do
; do something
done
并向这个脚本发送一些信号:
kill -10 <pidof test.sh>; kill -15 <pidof test.sh>;\
kill -10 <pidof test.sh>; kill -10 <pidof test.sh>;\
kill -15 <pidof test.sh>;
我得到了意想不到的结果:
sig 10 rcvd
sig 10 rcvd
sig 15 rcvd
sig 10 rcvd
sig 10 rcvd
那么,有人可以描述为什么会这样吗?为什么 bash(?) 混合信号/删除一个信号并添加其他信号??
UPD:还有一件有趣的事情。脚本看起来像:
trap 'echo "sig 15 rcvd"; exit ' 15
trap 'echo "EXIT"' EXIT
kill -15 后我有“sig 15 rcvd”和“EXIT”。 但是如果我发送 kill -15 两次 EXIT 处理程序没有执行:
sig 15 rcvd
sig 15 rcvd
最佳答案
您的基本困惑是因为您期望异步机制产生同步结果。
So, when I sent a few signals to this script:
kill -15 <pidof test.sh>; kill -10 <pidof test.sh>
I've got signal 10 received early than signal 15:
sig 10 rcvd sig 15 rcvd
那些信号没有排队。您发送第一个信号,它开始执行信号 15 陷阱,但在它完成之前您立即发送信号 10。第二个信号中断第一个陷阱的执行。现在它执行第二个陷阱打印 sig 10 rcvd
。当第二个处理程序完成时,它会恢复第一个中断的处理程序并打印 sig 15 rcvd
。
If I send 2 times signal 10 or 15 script printed only once it:
kill -15 <pidof test.sh>; kill -15 <pidof test.sh> sig 15 rcvd
信号在其信号处理程序执行时总是被暂时忽略。如果在陷阱完成之前收到任何重复信号,则不会处理它们。这是标准的 posix 信号处理行为。
很明显,这两种行为的组合可以解释为什么您无法轻松预测其他测试中的输出顺序。
关于linux - [ bash ] : Handling many signals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37630446/