どうした?
改修中のアプリがあり、プロセスを起動したり停止したりする必要があるが、起動中のプロセスを 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 ではちゃんと動きます。ちょっと調査に時間かかりそうなので取り急ぎこの手法で乗り切りたいと思います。