linux - [ bash ] : Handling many signals

标签 linux bash shell signals

我在玩 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/

相关文章:

linux - 如何在 bash 中获取从 Ping 收到的数据包的百分比?

bash - 如何使用 "find"通过正则表达式搜索文件名

java - Jenkins:如何通过 "source script"为 ant 任务设置环境变量

c - 如何通过管道传输用户输入的字符串?

linux - 使用静态库配置测试

bash - 将命令的输出结果存储到数组中

捕获我们有 wifi 连接的时刻

linux - 如何判断我是否在 screen 中?

c++ - c++中异步线程的实现

linux - grep 命令在每次匹配后添加结束行