upstart(init)でnginxを管理する
nginxの挙動は通常のデーモンと違うのでexpect daemon/forkは使えない。なので、foregroundに残すオプションで走らせて、プロセス管理はupstartに任せるしかない。
参照 http://serverfault.com/a/143650
/etc/init/nginx.conf
description "nginx"
start on filesystem
respawnpre-start script
test -x /usr/local/nginx/sbin/nginx || { stop; exit 0; }
end script# nginxの挙動は通常のデーモンと違うのでexpect daemon/forkは使えない。
# なので、foregroundに残すオプションで走らせて、プロセス管理はupstartに任せるしかない。
# 参照 http://serverfault.com/a/143650
exec /usr/local/nginx/sbin/nginx -g "daemon off;"
確認
$ sudo status nginx
nginx start/running, process 13171
$ sudo stop nginx
nginx stop/waiting
$ sudo status nginx
nginx stop/waiting
$ sudo start nginx
nginx start/running, process 13338
$ sudo status nginx
nginx start/running, process 13338
殺しても蘇える
$ sudo kill 13338
$ sudo status nginx
nginx start/running, process 13347
upstart(init)について
Debianを含む多くのLinuxディストロは/etc/init.d/にスクリプトを入れてデーモンを管理するSysV風のサービス管理系を使ってきた。SysVスクリプトは一般的にpidファイルによりプロセスを管理する。往々にプロセスが死んでこのファイルが残り、削除してから起動するような面倒なことになる。つまりPIDファイルによるプロセス管理は信頼性に欠ける。
Debianはinitプロセスが直接デーモンをフォークし、プロセスの親子関係でモニタリングする(んだと思う)upstart(init)というシステムを提供するようになった。PIDファイルではなく、カーネル内で管理されるプロセス系統で監視するからデーモンの安否が確実に把握できる。
DebianはSysVからupstartに移行する途中なのだろうか? 著者のmaverick(Ubuntu 10.10)は両方にスクリプトが入っている。
$ ls /etc/init |wc -l
68
$ ls /etc/init.d/ |wc -l
88
その辺が気になるが、PIDファイルが居座るなどのトラブルがなく、コケても確実に再サタートしてくれるので、debianパッケージが管理していない独自のサービスはupstartで管理するようにしている。