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; } }