FreeBSDで daemontools を使う
daemontoolsはUNIX系OSのデーモンサービスの管理(プロセス監視・ロギング)を簡単に扱うための管理ツール群の総称でである。 daemontoolsの特徴としてプロセス番号を意識することなく TERM、KILL、HUP などのシグナルを送ることができます。又デーモンが何かの不具合で落ちてしまっても常にプロセスを監視しているため自動的に再起動してくれます。 一般にdaemontoolsと呼ばれているツールには以下のようなものが含まれる。
- supervise - 起動させたデーモンプロセスの監視
- multilog - ロギングを行うためのプログラム
- svscan - サービスディレクトリ群の監視
- svstat - サービスデーモンの状態を表示
- svc - サービスデーモンの起動・停止・HUP
インストール
FreeBSDならportsにあるのでコマンド一つでインストール出来ます。
# portinstall sysutils/daemontools
自動起動設定
/etc/rc.conf に追加します。
svscan_enable="YES"
手動スタート
# /usr/local/etc/rc.d/svscan.sh start
デーモン登録例
perlで書かれた PSGIアプリケーション(hello.psgi)を daemontools で起動する設定
/path/to/hello.psgi
use Plack::Builder; use Plack::Middleware::ContentLength; use warnings; use strict; my $psgi = sub { return [200, ["Content-Type" => "text/plain"], ["hello psgi"]] }; builder { enable "Plack::Middleware::ContentLength"; $psgi; };
※/path/to/daemon_name のサービスを登録する wwwユーザ権限で動作
$ mkdir -p /path/to/daemon_name/daemon/log/main $ touch /path/to/daemon_name/daemon/run $ chmod +x /path/to/daemon_name/daemon/run $ touch /path/to/daemon_name/daemon/log/run $ chmod +x /path/to/daemon_name/daemon/log/run $ sudo chown www:www /path/to/daemon_name/daemon/log/main
デーモン起動用のrunスクリプト
/path/to/daemon_name/daemon/run
※必ず exec を使って起動するように設定する事、これをしないとデーモンになるプロセスが sh スクリプトから起動した事になってしまいます。 又、setuidgidを利用してwwwユーザとして起動するようにします。
#!/bin/sh exec 2>&1 cd /path/to/hello || exit 1 exec /usr/local/bin/setuidgid www /usr/local/bin/start_server --port 8089 -- /usr/local/bin/plackup -E production -s Starman -a hello.psgi
ロギング用runスクリプト
/path/to/daemon_name/daemon/log/run
※ログサイズやログローテートに関する設定
#!/bin/sh # s = Logfile Size, n = LogRotateSize # Logfile Size = 5MB exec multilog t s5242880 n10 ./main
daemontoolsによるサービスを開始します
$ sudo ln -s /path/to/daemon_name/daemon /var/service/daemon_name
※ /var/service/hogehoge にシンボリックリンクを付けた時点でサービスが起動しているはずです。 daemonの起動状態をチェック
svstatコマンドでデーモンの状態を確認出来ます。
$ sudo svstat /var/service/daemon_name
デーモンが起動upしている場合
/var/service/daemon_name: up (pid 56946) 1617 seconds
デーモンが起動downしている場合
/var/service/daemon_name: down 7 seconds, normally up
ログのチェック
※プログラムの異常がある場合、再起動を繰り返して負荷がかかる場合があるためログのチェックをする事。プログラムに不具合がありエラーが出ている時はこのログに書き込まれます。
$ tail -f /var/service/daemon_name/log/main/current
通常のlogで見る
daemontoolsで出力されるログはTAI64N形式のため日付時間が分かりませんので正確に見るときはtai64nlocalを通して見ます。
$ tai64nlocal < /var/service/daemon_name/log/main/current
daemontools 起動オプション
起動
$ sudo svc -u /var/service/daemon_name
停止
$ sudo svc -d /var/service/daemon_name
再起動
$ sudo svc -t /var/service/daemon_name
関連記事
FreeBSDで Supervisor を使う