在shell脚本中计时陷阱

时间:2012-11-14 01:00:11

标签: linux bash shell unix

我有一个运行“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

2 个答案:

答案 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,你可以使用现代信号语义编写自己的错误处理/信号处理代码,如果你想使用动态可加载的模块:

http://cfajohnson.com/shell/articles/dynamically-loadable/