2008-04-04
■TheSchwartz の worker を安全に停止する
TheSchwartz の worker を Ctrl-C とか kill で止めた場合に、job の処理が半端な状態で終わられると困る、という話。以前 Deamon::Generic で TheSchwartz の worker をデーモン化する(2) - 酒日記 はてな支店 で諦めたんだけど、ちょっと必要に迫られたので考えてみたら一応できたっぽい。
package MyWorker; use strict; use warnings; use base qw( TheSchwartz::Worker ); sub sighandler { warn "caught signal @_\n"; no warnings 'redefine'; *TheSchwartz::work_once = sub { exit }; } sub work { my ($class, $job) = @_; $SIG{HUP} = $SIG{INT} = $SIG{TERM} = \&sighandler; $job->completed(); }
シグナルハンドラで TheSchwartz::work_once を exit するだけのサブルーチンで再定義してしまう。けっこう無理矢理だ。
なぜこれでうまく行くかというと、TheSchwartz::work は以下のようになっているので
sub work { my TheSchwartz $client = shift; my($delay) = @_; $delay ||= 5; while (1) { sleep $delay unless $client->work_once; } }
無限ループ内で延々 work_once が呼ばれる形 (処理すべき job がなければ work_once は偽を返すので、一定時間 sleep)。ということで、work_once を exit するように書き換えてやれば、そこでプロセス終了。
最初はシグナルハンドラでフラグをセットして、work の最後でフラグが立っていたら exit、みたいに書いたのだが、work を抜けてから job の後始末があるのでよろしくない。 なのでこんな風にしてみた。
「必要に迫られて」というのは、worker をずっと動かしているとだんだんメモリ消費量が増えていく、という現象が起きているから。もちろんそれはそれで原因を解明しないといけないのだけど、とりあえずは定期的に再起動して凌ごうかと。
トラックバック - http://d.hatena.ne.jp/sfujiwara/20080404/1207298792
リンク元
- 325 http://labs.topicmaker.com/~fujiwara/s.html
- 39 http://reader.livedoor.com/reader/
- 11 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GZEZ_jaJP230JP230&q=連用テ接続
- 9 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=7barPBd.TTF&num=50
- 6 http://b.hatena.ne.jp/entrylist?sort=hot
- 6 http://b.hatena.ne.jp/hotentry?cname=music
- 6 http://fastladder.com/reader/
- 6 http://www.google.co.jp/search?sourceid=navclient&aq=t&hl=ja&ie=UTF-8&rlz=1T4GZEZ_jaJP236JP236&q=jpg+swf+変換
- 5 http://b.hatena.ne.jp/add?mode=confirm&title=TheSchwartz %u306E worker %u3092%u5B89%u5168%u306B%u505C%u6B62%u3059%u308B - %u9152%u65E5%u8A18 %u306F%u3066%u306A%u652F%u5E97&url=http://d.hatena.ne.jp/sfujiwara/20080404/1207298792
- 5 http://slashdot.jp/article.pl?sid=08/03/26/007247
