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 を使う

created:

Back to top