daemontools
サービスのデーモナイズと起動、停止、再起動の管理ツール
What is daemontools
daemontools は UNIX で起動するサービスを管理するツールコレクションです。
コマンド | 用途 |
---|---|
supervise | サービスを統括的に管理する |
svc | supervise 管理下のサービスを制御する |
svok | supervise 管理下のサービスが起動しているか確認する |
svstat | supervise 管理下のサービスの状態を確認する |
svscan | サービス群を開始、終了する |
multilog | 標準入力から一続きの行を読み、任意の数のログに選択された行を追加します。 |
tai64nlocal | TAI64N 形式のタイムスタンプを人が読める形式に変換します。 |
setuidgid | 指定されたアカウントの uid と gid で別のプログラムを起動します。 |
envdir | 指定したディレクトリにあるファイルによって修正された環境を設定して別のプログラムを起動させます。 |
インストール
環境はCentOS5.5
RPMソース持ってきて入れる。
sudo su;
mkdir work; cd work;
wget -nd http://www.qmailtoaster.com/download/stable/daemontools-toaster-0.76-1.3.6.src.rpm
rpmbuild --rebuild daemontools-toaster-0.76-1.3.6.src.rpm
mv /usr/src/redhat/RPMS/i386/daemontools-toaster-0.76-1.3.6.i386.rpm ./
rpm -Uvh daemontools-toaster-0.76-1.3.6.i386.rpm
init.d にコントロールスクリプトを仕込む。
wget -nd http://www.emaillab.org/djb/daemontools/svscan
mv svscan /etc/init.d/
chmod +x /etc/init.d/svscan
/sbin/chkconfig --add svscan
/sbin/chkconfig svscan on
構成
サービスの置き場所、本家。
/service
以下のような感じ。
/service/MyApp/run
/service/MyApp/log/run
run スクリプトには実行権限がいる。そして、MyApp ディレクトリには、スティッキービットを立てる。
chmod +t MyApp
慣習として、run や log ディレクトリは一般ユーザの管理ディレクトリからのシンボリックリンクとする。
/service
`-- /MyApp
|-- run -> /home/userfoo/MyApp/service/run
`-- /log -> /home/userfoo/MyApp/service/log/
ログを取得しないでかまわなければ、/log は不要。
起動と終了
svscan
サービス全体は svscan
で制御する。
# /etc/init.d/svscan start
Starting svscan: [ OK ]
svc
サービスごとは svc
コマンドで制御する。
# svc -u /service/MyApp/
option | means | 挙動 |
---|---|---|
-u | Up | サービスを起動します。サービスが止められたら、再開させます |
-d | Down | サービスが起動していたら、TERM, CONT シグナルを送信しサービスを停止させます。再開させません |
-o | Once | サービスが起動していなければ、開始させますが、サービスが停止されても、再開しません |
-p | Pause | サービスに STOP シグナルを送信 |
-c | Continue | サービスに CONT シグナルを送信 |
-h | Hangup | サービスに HUP シグナルを送信 |
-a | Alarm | サービスに ALRM シグナルを送信 |
-i | Interrupt | サービスに INT シグナルを送信 |
-t | Terminate | サービスに TERM シグナルを送信 |
-k | Kill | サービスに KILL シグナルを送信 |
-x | Exit | サービスがダウンしたらすぐに supervise は終了します。安定したシステムでこのオプションを使っているなら、何か間違っているでしょう。superviseは、永遠に動作するように設計されています |
svok
サービスの起動は svok
で確認できます
# svok /service/MyApp/; echo $?
0 で終了していれば起動している。起動していなければ 100 がかえる。
svstat
以下のように、svstat
コマンドでステータスを確認することもできます。
# svstat /service/MyApp/
/service/MyApp: up (pid 12401) 5616 seconds
0
multilog によるログ取得
/service/MyApp/log ディレクトリ内に run スクリプトを配置すると、/service/MyApp/run の出力を /service/MyApp/log/run の入力につないで動作するようになる。
log 取得用の run スクリプト
/home/userfoo/MyApp/service/log/run
#! /bin/sh
USER=userfoo
MULTILOG=/usr/bin/multilog
# 10MB
LOG_SIZE=10485760
# rotate
ROTATE=5
exec 2>&1
exec setuidgid $USER \
$MULTILOG t s$LOG_SIZE n$ROTATE .
上記の設定だと、ログファイルは、log ディレクトリ直下に current というファイル名で吐かれます。
multilog のオプション
t | 各行に TAI64N 形式のタイムスタンプを付与する |
-pattern | patternにマッチした行を出力しない |
+pattern | patternにマッチした行を出力する |
sSIZE | ログファイルをSIZEでローテートする(default:99,999byte) |
nNUM | ログをNUM世代ローテートする(default: 10) |
=file | 選択された先頭1,000バイトをfileへ出力 |
ログの確認
multilog のログタイムスタンプは TAI64N 形式という人間がそのまま読めない形式で記録されているので、tai64nlocal
で整形して読みます。
tail -f current | tai64nlocal
multilog 自体は、いろいろとフィルタやローテートの機能を備えているので、興味のある人は細かい機能を使ってみると良いと思います。