読者です 読者をやめる 読者になる 読者になる

Deamon::Generic で TheSchwartz の worker をデーモン化する(2)

Deamon::Generic でデーモン化した場合、開始はいいけど終了に問題が出る気がする。

stop した際には SIGINT が飛んでくるのだけど、TheSchwartz 自体は特に SIGINT をトラップしてたりはしないので、worker の処理中に stop が掛かると、処理が不完全なまま終了してしまう可能性が。
というか、これは別にデーモン化していない worker スクリプトを Ctrl+C で止めても同様か。
gd_run 内で SIGINT を拾うことはできるが……

sub gd_run {
    $SIG{INT} = sub {
        print "SIGINT!";
    };
    my $client = TheSchwartz->new(%{ $config });
    $client->can_do('MyWorker');
    $client->work();
}

拾ったところで、$client->work() を安全なタイミングで(現在処理中の job が終わるのを待って)止める方法が分からないなあ。
TheSchwarts->work は以下のようなコードになっているので、work_once が終わったところでループを抜けるようにできれば良さそうなのだけど。

sub work {
    my TheSchwartz $client = shift;
    my($delay) = @_;
    $delay ||= 5;
    while (1) {
        sleep $delay unless $client->work_once;
    }
}