2012-05-14

RHEL6: runit with Upstart

久しぶりにサーバーを再起動すると、

これはひどい。サーバーが故、滅多に再起動しないから気が付かなかった。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 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。