daemontools によるプロセス監視

daemontools は qmail の作者 D.J.B. によるツール群のひとつです。


daemontools とは

daemontools とは、デーモンを監視するツールのことです。 デーモンが不意にストップしたとき、それは止まったままになります。 しかし daemontools によって監視させておけば、 自動的に再起動してくれます。 また、監視のためのディレクトリを作成するので、 デーモン管理が一元化されるなどの利点もあります。

具体的には svscan というプログラムが各サービスを run (名前固定)というスクリプトで起動します。 注意事項は次の通りです。

インストール

ports でインストールできます。
# cd /usr/ports/sysutils/daemontools
# make install clean

FreeBSD 4.8-RELEASE 付属の ports コレクションでは、 daemontools-0.76 がインストールされます。 実行ファイルたちは /usr/local/bin 以下に、 起動サンプルは /usr/local/share/examples/daemontools 以下に コピーされます。

サービスディレクトリの作成

サービスを管理するためのディレクトリを作ります。 デフォルトでは /servise に作ることになっています。
# mkdir /servise
このディレクトリのサブディレクトリのさらに下に run という サービスデーモンを起動するためのスクリプトを置くと、 デーモンを管理するプログラム supervise が自動的に 子プロセスとして起動します。

svscan の起動

# csh -cf '/usr/local/bin/svscanboot &'
で svscan を起動します。

ブート時の自動起動(方法その1)

上の1行を /etc/rc.local に追加しておきます。

ブート時の自動起動(方法その2)

services.sh のようなスクリプトを書き、 実行権を与えて /usr/local/etc/rc.d/ に置いておきます。
# cp /somewhere/services.sh /usr/local/etc/rc.d
# chmod 755 /usr/local/etc/rc.d/services.sh

サービスデーモンの起動

管理をしやすくするために、run の実体を別の場所に置き、 run はシンボリックとしておくのが一般的のようです。 例えば、qmail-start を動かすには次のようにします。
# mkdir /var/qmail/supervise
# mkdir /var/qmail/supervise/qmail
# vi /var/qmail/supervise/qmail/run
(/var/qmail/supervise/qmail/ に run という名前で qmail-send の起動スクリプトを置く)

下の方法でログを取ることを考慮した run スクリプトは、 Maildir 形式用なら次のようなものでいいでしょう。
#!/bin/sh

#
# qmail/run : qmail-start starting script
#
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/
qmail-smtpd, qmail-apop に対する run スクリプトの具体例は、 qmail と daemontoolsを ご覧下さい。

run に実行権を与え、リンクを張ります。
# chmod +x /var/qmail/supervise/qmail/run
# ln -s /var/qmail/supervise/qmail /service/qmail
リンクを張ったら svscan によって5秒以内にサービスが開始されます。

ログをとる

daemontools パッケージには、ログを取るためのプログラム、 multilog が含まれています。 ここでは、multilog を使ったログの取り方を紹介します。 例として、上の qmail に対してログを取ってみましょう。

まずは、必要なディレクトリを作成します。
# mkdir -p /var/qmail/supervise/qmail/log/main

次に、スクリプトファイル log/run を作成します。
#!/bin/sh

#
# qmail/log/run : qmail log starting script
#
exec env - PATH="/usr/local/bin:/var/qmail/bin:$PATH" \
setuidgid qmaill \
multilog t ./main -'*' +'* status: *' =status
qmail-smtpd や qmail-apop のログに対する run スクリプトの具体例は、 qmail と daemontoolsを ご覧下さい。

作成したら log/run に実行権を与え、ディレクトリのオーナーとグループを ログ取得用ユーザ qmaill に変更しておきます。
# chmod +x /var/qmail/supervise/qmail/log/run
# chown -R qmaill:qnofiles /var/qmail/supervise/qmail/log

ログ付きの qmail-start を起動させます。 まず、qmail-start が動いていたら停止します。
# cd /service
# rm qmail
# svc -dx /var/qmail/supervise/qmail
/var/qmail/supervise/qmail/run スクリプトに変更が必要な場合は 変更します。 /service にリンクを張って起動させます。
# ln -s /var/qmail/supervise/qmail /service/qmail

run の変更

なんらかの都合で run スクリプトを変更しなければならなくなった場合、 run スクリプトを直接編集してはいけません。 編集中の run スクリプトが動いてしまうかもしれないからです。 そこで、run.new という新しいスクリプトファイルを用意して、 これを編集し、終ったら run と入れ換えます。
# cd /var/qmail/supervise/qmail
# cp -p ./run ./run.new
# vi run.new
# mv ./run.new ./run && svc -t /service/qmail
svc -t はサービスの終了命令です。 しかし、5秒以内に自動的に起動します。

サービスの確認と制御

svstat でサービスの状態を確認できます。
# svstat /service/qmail /service/qmail/log
/service/qmail b: up (pid xxxx) xxx seconds
/service/qmail/log: up (pid xxxx) xxx seconds
up となっていれば、起動しています。

svc というコマンドを使ってサービスを制御することができます。

参考サイト


FreeBSD の部屋


Last modified: Wed Apr 20 15:30:20 JST 2011