我有一个运行“nohupped”的shell脚本后台进程。这个过程应该在一个陷阱中接收信号,但是当玩一些代码时,我注意到如果它们之间的间隔太小,一些信号会被忽略。执行陷阱功能需要花费太多时间,因此随后的信号会消失 未被供电。不幸的是,trap命令没有某种信号队列,这就是我要问的原因:解决这个问题的最佳方法是什么?
一个简单的例子:
function receive_signal()
{
local TIMESTAMP=`date '+%Y%m%d%H%M%S'`
echo "some text" > $TIMESTAMP
}
trap receive_signal USR1
while :
do
sleep 5
done
答案 0 :(得分:2)
在不重新设计方法的情况下,最简单的更改是使用realtime signals,哪个队列。
这不便携。实时信号本身是可选的扩展,在任何情况下扩展都不需要它们的shell和实用程序支持。但是,Linux上的相关GNU实用程序 - bash(1)
和kill(1)
- 以常识方式支持实时信号。所以,你可以说:
trap sahandler RTMIN+1
和其他地方:
$ kill RTMIN+1 $pid_of_my_process
答案 1 :(得分:1)
您是否考虑过多个一行陷阱声明?您想阻止或处理的每个信号都有一个?
trap dosomething 15
trap segfault SEGV
此外,您希望在遇到原因时在信号处理程序中使用尽可能少的代码。
编辑 - 对于bash,你可以使用现代信号语义编写自己的错误处理/信号处理代码,如果你想使用动态可加载的模块: