【发布时间】:2011-05-02 22:06:54
【问题描述】:
我有这个简单的 perl 守护进程:
#!/usr/bin/perl
use strict;
use warnings;
use Proc::Daemon;
Proc::Daemon::Init;
my $continue = 1;
$SIG{TERM} = sub { $continue = 0 };
$SIG{USR1} = sub { do_process(1) };
# basic daemon
boxesd_log("started boxesd");
while ($continue) {
do_process(0);
sleep(30);
}
boxesd_log("finished boxesd");
exit(0);
# required subroutines
sub do_process {
my ($notified) = @_;
boxesd_log("doing it $notified");
}
但是有些东西不能正常工作。
当守护程序启动时,它会每 30 秒记录一次,而不会按预期发出通知:
2010 年 10 月 30 日星期六 21:05:47 做 0 2010 年 10 月 30 日星期六 21:06:17 做 0 2010 年 10 月 30 日星期六 21:06:47 这样做 0
当我使用kill -USR1 xxxxx 向进程发送USR1 信号时,问题就出现了。输出不是我所期望的:
2010 年 10 月 30 日星期六 21:08:25 这样做 1 2010 年 10 月 30 日星期六 21:08:25 做 0
我得到两个连续的条目,一个来自信号处理子例程,另一个来自不断运行的循环。似乎只要收到USR1 信号,睡眠就会中断。
发生了什么事?
【问题讨论】: