# daemontools ## サービスのデーモナイズと起動、停止、再起動の管理ツール {{TOC 3-}} ### What is daemontools daemontools は UNIX で起動するサービスを管理するツールコレクションです。 コマンド | 用途 | ------- | ---- | supervise | サービスを統括的に管理する | svc | supervise 管理下のサービスを制御する | svok | supervise 管理下のサービスが起動しているか確認する | svstat | supervise 管理下のサービスの状態を確認する | svscan | サービス群を開始、終了する | multilog | 標準入力から一続きの行を読み、任意の数のログに選択された行を追加します。 | tai64nlocal | TAI64N 形式のタイムスタンプを人が読める形式に変換します。 | setuidgid | 指定されたアカウントの uid と gid で別のプログラムを起動します。 | envdir | 指定したディレクトリにあるファイルによって修正された環境を設定して別のプログラムを起動させます。 | [daemontools に含まれる主なコマンド] ### インストール 環境は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は、永遠に動作するように設計されています | [svc コマンドのオプション] #### 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 のオプション] #### ログの確認 multilog のログタイムスタンプは TAI64N 形式という人間がそのまま読めない形式で記録されているので、`tai64nlocal` で整形して読みます。 tail -f current | tai64nlocal multilog 自体は、いろいろとフィルタやローテートの機能を備えているので、興味のある人は細かい機能を使ってみると良いと思います。 ### 参考 * [[http://cr.yp.to/daemontools.html daemontools]]