daemontoolsとは
プロセス管理とロギングを行うツールです。プロセスを監視し、もし異常終了しても即座に再起動することが可能になります。システムの可用性を保つのに非常に有効です。
2001年にリリースされたv0.76で完成されたようで、それ以来開発が止まっています。
インストール
以下はCentOSでの例です。yumにはパッケージが無いので、RPMをリビルドしてインストールします。
# wget http://www.qmail.org/rpms/RPMS/daemontools-0.76-112memphis.i386.rpm
# rpm -ivh daemontools-0.76-112memphis.i386.rpm
その他のディストリビューションの場合、ソースからビルドしてください。
ちなみにDebian系の場合はaptパッケージがあるようです。
参考: ブローヴちゃん: Debian に daemontools をインストール
RPMからインストールするとデーモンは自動起動しないため、手動で起動します。
# svscan /service &
[1] 30103
初期設定
inittab組み込み
Linux起動時にdaemontoolsが自動起動されるようにします。
- /etc/inittabの最下部に下記の行を追加
#daemontools
SV:123456:respawn:/command/svscanboot
- inittab再読み込み
これでdaemontoolsの監視プロセス(supervise, svscan)が起動します。
# ps aux | grep supervise
root 7738 0.0 0.0 3676 364 ? S 16:39 0:00 supervise ttserver
# ps aux | grep svscan
root 7736 0.0 0.0 3848 424 ? S 16:39 0:00 svscan /service
それぞれのプロセスの役割は、下記の記事に大変詳しく書いてあります。
私家版 daemontools FAQ (1/3)
基本コマンド
mojamojaデーモンを操作するコマンドは以下の通りになります。runスクリプト(後述)は「/service/mojamoja/run」という想定です。
デーモンの操作
# svc -u /service/mojamoja
# svc -d /service/mojamoja
# svc -t /service/mojamoja
- サービスの停止後 supervise を終了し、再起動しないようにする
# svc -dx /service/mojamoja /service/mojamoja/log
- 全てのサービスの停止後 supervise を終了し svscan を終了する
# svc -dx /service/*
# svc -dx /service/*/log
# killall svscan
その他、HUPやALRMなどのシグナルを送ることもできます。詳しくは daemontools howto をご覧ください。。
状態確認
svok
# svok /service/mojamoja/; echo "$?"
0
0が表示されればデーモンは正常に動いています。
svstat
# svstat /service/mojamoja/
/service/mojamoja/: up (pid 12482) 0 seconds
「up」ならばプロセスが起動しています。
ただし、「* seconds」が増加せずいつまでも0や1の場合、うまく動いていない可能性が大です。
(下記のトラブルシューティング参照)
ps aux
最新のエラーはプロセス一覧に表示されます(わかりづらい)。正常な時は下記のように「…….」と表示されますが、エラーがあると「…」の代わりにエラーメッセージが入ります。
$ ps aux | grep read
root 29781 0.0 0.0 3664 328 ? S 17:46 0:00 readproctitle service errors: ................................................................................................................................................................................................................................................................................................................................................................................................................
ログの表示
daemontoolsのログには、「TAI64N形式」という、うるう秒を考慮したタイムスタンプが付いています。正確ですが人間に可読ではありません。
そこで、daemontools付属のtai64nlocalを使うことで、ログを読みやすくすることができます。
$ tai64nlocal < /service/ttserver/log/main/current
2012-01-16 18:32:29.571225500 Starting the server of Tokyo Tyrant
2012-01-16 18:32:30.593347500 Existing process: 8790
なお、「/service/mojamoja/log/main」配下には「@*.s」「@.u」から始まるファイルが複数出現します。前者は正常に書き込み完了した古いログ、後者は異常終了した古いログファイルです。
監視スクリプトの作成
daemontools の svscan プロセスは定期的に /service 内を監視します。
また、標準出力のメッセージをロギングするため、「exec 2>&1」を指定しています。
以下、mojamojaプロセスを監視するスクリプトと、その実行結果をロギングするスクリプトを書きます。
監視スクリプト
# mkdir /service/mojamoja/run
# vi /service/mojamoja/run
----
#!/bin/sh
exec 2>&1
exec /usr/local/bin/mojamoja start
----
# chmod u+x /service/mojamoja/run
ログ出力スクリプト
デーモン化したプログラムの標準出力と標準エラーをログに出力します。
# mkdir -p /service/mojamoja/log/main
# vi /service/mojamoja/log/run
----
#!/bin/sh
exec 2>&1
exec multilog t ./main
----
# chmod u+x /service/mojamoja/log/run
以上で完成です。
superviserはmojamojaプロセスを監視しています。
異常発生時にはロギングを行い、プロセスは自動で再起動できるようになりました。
プロセスの監視を開始するには、「svc -u /service/mojamoja」コマンドを実行します。
# svc -u /service/mojamoja/
# svstat /service/mojamoja/
/service/mojamoja/: up (pid 18080) 3 seconds # 無事稼働
# kill -9 18080 # 異常終了
# svstat /service/mojamoja/
/service/mojamoja/: up (pid 18132) 3 seconds # ちゃんと再起動しています
トラブルシューティング
superviseがエラーを吐く
svstatコマンドの結果、以下のようなエラーが出る場合。
# svstat /service/mojamoja
supervise: fatal: unable to acquire mojamoja/supervise/lock: temporary failure
指定したデーモンが正しく終了しなかった時に出るようです。再起動することで修復します。
# svc -dx /service/mojamoja /service/mojamoja/log
デーモンが1秒以上動かない
svstatを見ると起動時間が0秒 or 1秒で、何度も再起動が発生している場合、プロセスがバックグラウンドで実行されている可能性があります。
バックグラウンドで実行してしまうと、superviserはプロセスが起動していることを認識できず、何度も再起動して、そのたびプロセスから「起動済み」エラーが出て強制終了させられます。
runファイルに書き込むプロセスはフォアグラウンドで実行させなければいけません。
exec mojamoja.sh & # NG
exec mojamoja.sh # OK
「デーモンとして起動」といった起動オプションを付けている場合も要注意です。
私はTokyoTyrantで「-dmn」オプションを付けていることに気付かず4時間ほど浪費しました。
参考
最近のコメント