久しぶりにサーバーを再起動すると、
これはひどい。サーバーが故、滅多に再起動しないから気が付かなかった。umount できないと文句を言われたパーティションは、runit で起動したプロセスが使用している。なので runit が原因に違いない。
runit の Upstart 用設定(/etc/init/runsvdir)は、runit 公式サイトからコピペしたものを使っている。
# for runit - manage /sbin/runsvdir-start
start on runlevel [2345]
stop on shutdown
respawn
exec /sbin/runsvdir-start
まず考えるべきは、runsvdir は SIGTREM を受けたとき、子プロセス(runsv)をどうするのか? とはいえさっきのエラーを見れば想像はつく。
If runsvdir receives a TERM signal, it exits with 0 immediately. If runsvdir receives a HUP signal, it sends a TERM signal to each runsv(8) process it is monitoring and then exits with 111.
runsvdir は SIGTERM を受けると自身が終了するだけで、子プロセスはそのまま残ってしまう。これが冒頭のエラーの原因だろう。子プロセスも終了させるには、SIGHUP を使う必要がある。では Upstart に SIGHUP を送らせるにはどうするか。
まあ予想はしていたが、はい動きませんでしたー :-p。案の定、RHEL6 の Upstart では未実装の様子。まして start-stop-daemon なんてある訳ない。暫く悩んで、post-stop で子プロセスを終了させることにした。pre-stop だと、終了した傍から runsvdir が復活させてしまう可能性がある。
# for runit - manage /sbin/runsvdir-start
start on runlevel [2345]
stop on shutdown
respawn
exec /sbin/runsvdir-start
post-stop script
pkill -x runsv || true
end script
ううむ、まだ変だ。子プロセスは終了できたみたいだが、そもそも runsvdir が respawn される状況がおかしい。
と、ここまで来てようやく事の本質に気が付いた。何も疑わず runit 公式サイトからコピペしてきたが、そもそも「shutdown」などというイベントは存在するのか? 結論から言うと、公式サイトが嘘。素直に Upstart cookbook に従うべし。
# for runit - manage /sbin/runsvdir-start
start on runlevel [2345]
stop on runlevel [016]
respawn
exec /sbin/runsvdir-start
post-stop script
pkill -x runsv || true
end script
うん、満足。:-)
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。