Ric*_*mon 5 linux perl signals daemon
我有这个简单的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");
}
Run Code Online (Sandbox Code Playgroud)
但有些事情是行不通的.
守护程序启动时,它会每30秒记录一次,而不会发出预期的通知:
Sat Oct 30 21:05:47 2010 doing it 0 Sat Oct 30 21:06:17 2010 doing it 0 Sat Oct 30 21:06:47 2010 doing it 0
当我使用USR1
信号发送信号时问题就出现了kill -USR1 xxxxx
.输出不是我所期望的:
Sat Oct 30 21:08:25 2010 doing it 1 Sat Oct 30 21:08:25 2010 doing it 0
我得到两个连续的条目,一个来自信号处理子程序,另一个来自永远运行的循环.似乎每当USR1
接收到信号时睡眠就会中断.
到底是怎么回事?
在您的程序将处理输入信号的意义上,睡眠中断,但循环将继续(返回睡眠状态),直到收到TERM信号.这是sleep()函数的记录行为:
如果进程收到诸如"SIGALRM"之类的信号,则可能会中断.
请注意,如果您需要休眠30秒,即使被信号中断,您也可以确定睡眠的秒数,然后再次休眠:
while (1)
{
my $actual = sleep(30);
sleep(30 - $actual) if $actual < 30;
}
Run Code Online (Sandbox Code Playgroud)
PS.您可以阅读更多关于perldoc perlipc中信号处理的信息,以及W. Richard Stevens的几乎所有unix编程书.:)