1

我有一个运行“nohupped”的shell脚本后台进程。这个过程应该在陷阱中接收信号,但是在玩一些代码时,我注意到如果它们之间的间隔太小,一些信号会被忽略。陷阱函数的执行花费了太多时间,因此后续的信号将不可用。不幸的是,陷阱命令没有某种信号队列,这就是我问的原因:解决这个问题的最佳方法是什么?

一个简单的例子:

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
4

2 回答 2

2

在不重新设计方法的情况下,最简单的更改是使用排队的实时信号

这不是便携式的。实时信号本身是一个可选扩展,在任何情况下扩展都不需要对它们的 shell 和实用程序支持。然而,Linux 上的相关 GNU 实用程序——bash(1)而且kill(1)——确实以常识的方式支持实时信号。所以,你可以说:

trap sahandler RTMIN+1

并且,在其他地方:

$ kill RTMIN+1 $pid_of_my_process
于 2012-11-14T15:38:05.437 回答
1

您是否考虑过多个单行陷阱语句?每个要阻止或处理的信号一个?

trap dosomething 15
trap segfault    SEGV

由于您刚刚遇到的原因,您还希望在信号处理程序中包含尽可能少的代码。

编辑 - 对于 bash,您可以在 C 中编写自己的错误处理/信号处理,或者如果您想要使用动态可加载模块,则可以使用现代信号语义编写任何其他代码:

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

于 2012-11-14T01:09:48.697 回答