У меня есть простой демон 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 секунд без уведомления, как ожидалось:
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
.
Что происходит?