あいつの日誌β

働きながら旅しています。

Supervisord で daemon の管理をカジュアルにしたい

どうした?

改修中のアプリがあり、プロセスを起動したり停止したりする必要があるが、起動中のプロセスを term で停止しないで kill しつつ restart させたい。

やるぞ!

インストール

% brew install supervisrod

設定ファイルの雛形を適当な場所に書き出す

[supervisord]
nodaemon=true               ; (start in foreground if true;default false)

[program:isuda]
command=carton exec -- plackup -s Starlet -p 5000 --max-workers=5 isuda.psgi
autostart=true
autorestart=false
stopasgroup=true
killasgroup=true

stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:isutar]
command=carton exec -- plackup -s Starlet -p 5001 --max-workers=5 isutar.psgi
autostart=true
autorestart=false
stopasgroup=true
killasgroup=true

stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:isupam]
command=bin/isupam
autostart=true
autorestart=false
stopasgroup=true
killasgroup=true

実行する。設定ファイルには nodeamon にしてあるので下記のプロセスはフォアグランドで起動します。

% supervisord -c supervisord.conf

フォアグランドのプロセスを Ctrl+C で止めると TERM がプロセスに送信され、supervisord 配下のプロセスに対して KILLALL が送信されるんだと思います(たぶん)

おしまい。

余談

なんでこんな事する必要があるかというと carton exec -- plackup -s Starlet -p 5000 --max-workers=5 isuda.psgi のように Starlet を使っている場合に TERM を送信するのと KILL を送信するので挙動が違う謎現象に遭遇したためです。

Perl には DESTROY という便利な機能があるのでそれを使ってログを仕込んでオブジェクトが解放されるタイミングでエラー出力を吐き出すようにしたのですが、Starlet を使っていると TERM では無言ですが KILL だと動くという謎に遭遇しました。ちなみに Starman ではちゃんと動きます。ちょっと調査に時間かかりそうなので取り急ぎこの手法で乗り切りたいと思います。