2024/02/13 22:13:39

daemontools

サービスのデーモナイズと起動、停止、再起動の管理ツール

What is daemontools

daemontools は UNIX で起動するサービスを管理するツールコレクションです。

daemontools に含まれる主なコマンド
コマンド 用途
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/
svc コマンドのオプション
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 のオプション

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 自体は、いろいろとフィルタやローテートの機能を備えているので、興味のある人は細かい機能を使ってみると良いと思います。

参考

サイト内検索