2013年01月11日

スレタイ速報だから内容は無いけど、 plackup -R や plackup -r した場合には Plack::Loader::Restarter で fork して親プロセスでファイルシステム監視をして、変更があったら子プロセスで立ち上げた plack を再起動するみたいな事やってるんだけど、この親プロセスに対して SIGTERM を送ると子プロセスの方にも TERM 送ってくれるから良いんだけど、うっかり SIGHUP を送っちゃうと親プロセスだけ死んで子プロセスだけ生き続けるという事になる。

-R, -r は開発用なので基本的にはコマンドラインで plackup 起動した時に使うから問題にはならない。が、うっかり daemontools 配下で plackup -R とかすると、 server starter 使ってるつもりで svc -h とかでうっかり HUP を送ってしまったりするのである。
そうすると plackup のプロセスが initd の子供になっちゃて残り続けて daemontools 配下で立ち上げようとした plackup が port が塞がって起動しないような事になる。
Starlet とかで子プロセスを増やしていたら、さらに対処がめんどくさい事この上ない。

なので、 daemontools 配下で -R, -r つかっちゃだめって結論に半年前になってたのにうっかり忘れててハマったのでエントリ書いたわけ。

でも何かしらの事情で -R, -r 相当の事を daemontools 配下の plackup でやりたい時もあるかもしれないので、そういう時は素直に server starter とか使っとくと良い。 デフォルトで HUP 受け取った時に子プロセスに TERM を送ってくれる。
もし server starter 使いたくなかったら watcher --signal=TERM -- plackup -R ... みたいな事すればよい。

Posted by Yappo at 2013年01月11日 15:00 | TrackBack | Perl
Comments
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。