2010/12/06

daemontoolsの利用法をいくつか


こんにちわ、stoneです。

いままで、MySQL関連のご紹介をいくつかしてきましたが、今回は、少々切り口を変えて、daemontoolsについて、いくつかご紹介してみたいと思います。


daemontoolsのものすごく簡単な概要

daemontoolsとは、プロセス監視を行ってくれるデーモンプロセスです。
監視対象のプロセスが、何らかの理由で落ちた場合、daemontoolsが自動的に再起動を行ってくれます。DECOLOGでは、qmail、memcached、keepalived、gearmand等のプロセス監視で利用しています。
daemontoolsそのものの詳しいことは、本家サイトhttp://cr.yp.to/daemontools.html等を参照してください。


ディレクトリ構成

daemontoolsは、/service/xxxxxxというディレクトリを見つけると、その下にあるrunファイルを実行します。DECOLOGでは、/etc/supervice/xxxxxxというディレクトリを作成し、対象プロセスのすべての準備が整った後、
# cd /service
# ln -s /etc/supervice/xxxxxx
として、daemontoolsの監視下に置きます。
daemontoolsは、runに不備があっても、問答無用で起動しようとするので、この様な方法をとっています。


daemontools + memcacached

memcachedをdaemontoolsの監視下に置く際の、runスクリプトは以下のようになっています。
#! /bin/sh

PATH=/usr/local/bin:$PATH
BOOT_LOG=/var/log/memcached.log

USER=nobody
PORT=11211
CACHESIZE=2048
MAXCONN=2000
OPTIONS=""

exec memcached -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN $OPTIONS
memcachedは、/usr/local/bin以下にインストールされていると想定しています。
ここでは、通常memcachedをデーモンとして立ち上げる際の「-d」オプションを指定しません。
また、CACHESIZEやMAXCONNは、アテの値なので、起動前に適宜変更しています。


daemontools + keepalived

keepalivedの場合のrunスクリプトは、こんな↓感じです。
#! /bin/sh

PATH=/usr/local/sbin:$PATH

exec 2>&1
exec keepalived -n -d -D -S6

ここでもkeepalived自体のデーモンプロセス化を避ける「-n」オプションを指定します。
また「-S6」オプションは、このオプション指定すると、syslogのlocal6にログが出力されます。なので、/etc/syslog.confに
*.info;mail.none;authpriv.none;cron.none;local6.none  /var/log/messages
local6.*  /var/log/keepalived.log
と記述しておけば、keepalivedのログは、/var/log/keepalived.logに出力されます。


また、keepalivedは、HUPシグナルを受け付けてくれるので、何らかの変更があった場合、
# svc -h /service/keepalived
で、再起動することができます。


daemontools + gearmand

gearmandでのrunスクリプトは、こんな↓感じです。
#! /bin/sh

PATH=/usr/local/sbin:$PATH
LOG=/var/log/gearmand.log

USER=root
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
exec gearmand -u $USER -l $LOG
しつこいですが、ここでもデーモンプロセス化しないように「-d」を指定しません。
そういえば、gearmandは、立ち上げた後、このサーバーで何かオペレーションした記憶がありません。gearmandのことを、忘れかけていました。(笑)


readproctitleのメッセージを消す

daemontoolsを使用していると困るのが、readproctitleというエラーメッセージ用のプログラムです。これは、runスクリプトを実行の際に、何かエラーが発生した場合、このreadproctitleにエラーメッセージが表示されます。
$ ps ax
----snip----
 5164 ?        S      0:00 readproctitle service errors: ...........................................
----snip----
何かエラーが起きると、この「....」の部分にエラーメッセージが表示されるのですが、これが自動的にクリアされません。なので、DECOLOGでは、以下のようになプログラムを用意しています。

/service/clearmsg/run
#! /bin/bash
yes '' | head -4000 | tr '\n' .
このままだと、このスクリプトが何度も実行されてしまうので、事前に
# touch /service/clearmsg/down
として、通常は、停止状態にしておきます。で、エラーを消したいときに、
# svc -o /service/clearmsg
として、一回だけ上記のrunスクリプトを実行させます。
この辺は、みなさん、困っているらしく検索すると似たような対処法がいくつも出てきます。


daemontoolsを完全に落とす

サーバーの役割の組み替えや、移動などで、daemontoolsが不要になるケースがあります。この場合、単純にdaemontools関連のプロセス(svscan、readproctitle、supervise等)をkillしても、すぐに同じプロセスが再起動されてしまいます。
daemontoolsは、インストールする際に/etc/inittabに
SV:123456:respawn:/command/svscanboot
という記述を追加しています。
daemontoolsを完全に落とす場合は、/etc/inittabのこの行を消すか、コメントアウトして、
# telinit q
とすると、完全にプロセスが落ちます。


次回は、うーん。。。。。。
まだ数台で運用していた頃の思い出話にしようか、サーバー監視にしようか、さっき思い出したgearmanの話にしようか、ちょっと、迷ってます。まぁ、書き始めるときの気分で決めます。(笑)

では、また次回に♪