Debian に daemontools をインストール

実は以前 Windows でも nginx + PHP の環境を作って PHP スクリプトを書いていたこともあったのだが、その時「いつの間にかプロセスが居なくなっている」というミステリーに遭遇した。
Windows 版がそんなに安定動作するとは思えないのでそれ自体は不思議ではないのだが、やはりサーバとして使うのであれば勝手に nginx とか PHP が居なくなってサイトが見れなくなっているのは寂しい(とはいえアクセスが少ないので実質的な問題はほとんどないが……)。

ServerMan@VPS の Entry プランはメモリも少なめで swap 領域も現状はないので、OOM Killer 様がやってきて殺戮していく可能性もあるし、でも自分が書いたスクリプトのバグなどで大量にメモリ食い潰したりした時は落として欲しいので OOM Killer 様も必要。
というわけで落ちた後に何食わぬ顔で立ち上がってくるようにしておきたいので、今回は daemontools をインストールしてみようと思う。

daemontools は apt-get でインストール。
apt-get install daemontools daemontools-run
基本的にはこれだけで daemontools は起動する。
daemontools でプロセスを監視させる場合、daemontools 側からサービス起動をしなければいけないようなので、nginx と php5-fpm を自動実行の対象から外しておく。sshd は OOM Killer の対象外だし失敗すると作業続行が出来なくなる可能性があるので取りあえず今回は除外。 まずは nginx から。
invoke-rc.d nginx stop
update-rc.d -f nginx remove
pushd /etc/service
mkdir nginx
pushd nginx
vim run
#!/bin/sh
exec 2>&1
exec /usr/local/sbin/nginx -c /usr/local/nginx/nginx.conf -g 'daemon off;'
chmod 700 run
svc -u /etc/service/nginx
これで daemontools 経由で起動することができたので、
ps ax | grep nginx\\:
に現れたプロセスIDを全てkillしても違うプロセスIDで何度でも蘇るようならラピュタの完成。

続いて php5-fpm。
こちらは foreground で動かすためには conf を触らないといけないらしい。
vim /etc/php5/fpm/php5-fpm-daemontools.conf
daemonize = no
include = /etc/php5/fpm/php5-fpm.conf
これで恐らく php5-fpm-daemontools.conf を読んだあとに本来の php5-fpm.conf を読みに行ってくれるはず。
直接 php5-fpm.conf に書かなければ invoke-rc.d php5-fpm start した時にも問題なく動いてくれる。
invoke-rc.d php5-fpm stop
update-rc.d -f php5-fpm remove
popd
mkdir php5-fpm
pushd php5-fpm
vim run
#!/bin/sh
exec 2>&1
exec /usr/bin/php5-fpm --fpm-config /etc/php5/fpm/php5-fpm-daemontools.conf
スクリプトの準備もできたので実際に実行してみる。
chmod 700 run
svc -u /etc/service/php5-fpm
立ち上がる。が、php5-fpm はプロセスたくさん立ち上がるのね……。
同じように kill で頑張ってプロセスID全部入力して落としたけどすぐに起き上がってきたのでこれも成功した模様。

これで OOM Killer が物凄い勢いで頑張り出しても問題なく動きそうな感じになった。はず。
daemontools 自体がやばいことになった時には daemontools も落としてくれていいので、OOM Killer の対象外には特に何も指定していない。

2010-12-01 追記 ----
わかりやすい日本語ドキュメントを見つけた。
ここの説明を読んでみると、どうも daemontools にデーモンを登録する際は /etc/services/* にはシンボリックリンクを置く方針らしく、直接ファイルを作成したりはしていないようだ。
更にシンボリックリンクを配置したら自動的に起動すると書いているので、導入時手動で立ち上げる必要はなかったと思われる。