確実に再起動して欲しい(ダウンして欲しくない)プログラム(デーモン)は、daemontools を使いますが
(※ runit というツールもある様ですが、未検証・・・。)
FreeBSD上にインストールした daemontools は、daemontools 自体のプロセスが落ちると再起動されない。
※ daemontools が面倒をみているプロセスは(daemontools 自体がダウンしていなければ)確実に再起動されます。
どういう事かと言うと、
Linux であれば、/etc/inittab に ダウンしてほしくないプログラムのコマンドを書くと、
プロセスがダウンしても確実に再起動してくれます。
例えば、daemontools をインストールすると
$ tail -n1 /etc/inittab SV:123456:respawn:/command/svscanboot
となり、daemontools(svscanboot)がダウンしても、inittab が確実に再起動してくれます。
FreeBSD は、inittab が無く init と、/etc/rcやrc.local等と、/etc/ttys で構成されている?様です。
/etc/rcやrc.local は、
http://tools.qmail.jp/daemontools/faq/create.html#why
に書かれている通り、
inittabの様にダウンしてしまったプロセスは再起動されない。
そこでの対応方法は、
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=init&dir=jpman-8.0.2%2Fman§=0
に、
init ユーティリティは任意のデーモンを走行させ続けるためにも使用可能であ
り、デーモンが死んだ場合には自動的に再開します。この場合、ttys(5) ファイ
ルの 1 番目のフィールドは、設定されたデバイスノードへのパスを参照してはな
らず、デーモンに対する最後のコマンドライン引数として渡されます。これは
AT&T System V UNIX /etc/inittab にある機能と同様です。
との記載があるのを参考に、
次の様に設定を行う。
>$ vim /etc/ttys # name getty type status comments # Virtual terminals ttyv1 "/usr/libexec/getty Pc" cons25 on secure ttyv2 "/usr/libexec/getty Pc" cons25 on secure ttyv3 "/usr/libexec/getty Pc" cons25 on secure # daemontools daemontools "/command/svscanboot" unknown on
name の欄に、「daemontools」 と設定しているが、これは コマンドの引数となるもの。ここでは適当に設定している。
この様な使い方があっているかは不明であるが、これで確実に再起動される様になる。
「参考」
※インストールの仕方による、起動プロセスの違い:
pkg_add -r daemontools した場合
>$ ps axd
PID TT STAT TIME COMMAND
0 ?? DLs 0:16.34 [kernel]
1 ?? ILs 0:00.13 - /sbin/init --
5243 ?? S 0:00.14 |-- /usr/local/bin/svscan /var/service
5352 ?? I 0:00.21 | |-- supervise demo
5503 ?? S 0:00.11 | | `-- perl ./demodaemon.pl
5353 ?? I 0:00.01 | `-- supervise log
5355 ?? S 0:00.10 | `-- multilog t -* +*COUNT* ./count -* +*[SIG-* ./sig +* ./main
5244 ?? I 0:00.00 |-- [readproctitle]
ソースからインストールした場合(http://cr.yp.to/daemontools/install.html)
>$ cat /etc/rc.local csh -cf '/command/svscanboot &'
>$ ps axd
PID TT STAT TIME COMMAND
0 ?? DLs 0:16.68 [kernel]
1 ?? ILs 0:00.14 - /sbin/init --
6629 0 I 0:00.04 `-- /bin/sh /command/svscanboot
6631 0 S 0:00.02 |-- svscan /service
6650 0 I 0:00.01 | |-- supervise demo
6653 0 S 0:00.03 | | `-- perl ./demodaemon.pl
6651 0 I 0:00.01 | `-- supervise log
6652 0 S 0:00.01 | `-- multilog t -* +*COUNT* ./count -* +*[SIG-* ./sig +* ./main
6632 0 I 0:00.01 `-- [readproctitle]
ソースからインストールした場合、 svscanboot が使用されるが、 pkg_add だと 使用されない。