[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [+]

FreeBSD で daemontools

daemontools は、デーモンを監視するためのツールです。 うれしいことに、デーモンが死んでしまっても再起動してくれるという、 まことにご丁寧なひとです。
インストールや設定方法は、 ここをたどると詳細に記述されています。…が、ここにも簡単に記載しておきます。

目次


1. 環境

OS:FreeBSD-4.1R (しかも VMware 上…)
source:daemontools-0.70.tar.gz
ports:ucspi-tcp-0.88

2. インストール

とっても簡単です。/usr/local/bin にインストールされます。

  % tar xfz daemontools-0.70.tar.gz
  % cd daemonntools-0.70
  % make
  % su
  # make setup check
  # mkdir /usr/local/service
  # chmod 755 /usr/local/service

あと、OS 起動時に動き出すように、/usr/local/etc/rc.d/service.sh というファイルを作成しておきます。ファイル名は他とかち合わなければ 問題ありませんが(最後が .sh でないと起動されませんが)、root が実行 できるパーミッションにしておきましょう。

  #!/bin/sh
  PATH="/usr/local/bin:/usr/sbin:/usr/bin"
  export PATH

  case $1 in
  start)
    /usr/local/bin/svscan /usr/local/service &
    ;;
  stop)
    # TE-NU-KI-
    ;;
  *)
    echo "Usage: $0 {start|stop}"
  esac

わりと適当ですが…。
管理用のディレクトリは、本来は /service なのですが、私はあまのじゃく なので /usr/local/service にしました。(管理する際、このパスを打ち込む のが面倒臭いですが…。:-p)
手動で動かすなら、./service.sh start などとすれば動き出します。
ちなみに、/usr/local/bin にパスを通しておかないと、supervise が動いて くれません。(最近気づきました…。)

3. 設定

svscan は、指定したディレクトリのサブディレクトリ毎に supervise を 起動します。supervise は、サブディレクトリにある run ファイルを実行 し、これが終了したら再度実行します。
qmail publicfile などは、daemontools 用の設定がもれなくついてくるので、特に設定する 必要はないと思います。 しかし、inetd から起動されるサービスや別のサービスを起動させるには、 自力で設定する必要があります。
例えば、telnetd を inetd からでなく daemontools から起動させる場合、 ucspi-tcp の tcpserver を利用して、以下のように設定します。

  # mkdir -p /usr/local/etc/tcpserver/telnetd
  /usr/local/etc/tcpserver/telnetd/run を作成
  # ln -s /usr/local/etc/tcpserver/telnetd /usr/local/service

ここで、run スクリプトは、例えば以下のようにしておきます。

  #!/bin/sh
  /usr/local/bin/tcpserver -vRH -c 2 \
        0 telnet /usr/libexec/telnetd 2>&1

ここで、-v は、エラーメッセージやステータスメッセージを出力させるため のオプションです。-RH は、ホスト名を DNS で解決する必要がないときなど に指定します。-c は、指定した数のコネクションだけしか受け付けないよう にします。
0 のところはホストを指定します。0 であれば INADDR_ANY で listen しま すし、IPアドレスを指定すればそのアドレスで listen します。
telnet のところは listen するポートの指定です。
残りはデーモンの起動プログラムとそのオプションを指定します。
ただ、これですと、標準出力にステータスなどが出力されてしまいます。 そこで、ログを multilog でとるようにしてみましょう。 まずは、現在のサービスを止めます。(これが正しい方法かどうかはよく わかりませんが…。)

  # rm /usr/local/service/telnetd
  # kill telnetdを見てるsuperviseのPID
  # kill tcpserverのPID

そして、以下のように log などを追加します。

  # cd /usr/local/etc/tcpserver/telnetd
  # chmod u+t .
  # mkdir -p log/main
  # touch log/status
  log/run の作成

svscan は、サブディレクトリに sticky bit が立っていると、log/run も 実行します。実行するだけでなく、2つのプロセスを pipe でつなぎ、サブ ディレクトリ側の出力を log 側に流します。
log/run は、例えば以下のようにしておきます。

  #!/bin/sh
  multilog t ./main

引数ですが、t は、ログの各行の先頭に日付(tai64n 形式)を挿入します。 ./main は、ログを記録するディレクトリの指定です。log/main/current に記録されます。内容は以下のようになります。

  @400000003b48e0fd2840310c tcpserver: status: 0/2
  @400000003b48e117034d67d4 tcpserver: status: 1/2
  @400000003b48e11705ca8564 tcpserver: pid 28174 from 192.168.0.211
  @400000003b48e11733dfda94 tcpserver: ok 28174 s.in.usupi.org:192.168...
  @400000003b48e11930dc3f54 tcpserver: end 28174 status 256
  @400000003b48e1193103e3c4 tcpserver: status: 0/2

@ 以降が tai64n 形式の日付です。tai64nlocal コマンドでわかりやすい 形式に変換できます。

  # tai64nlocal < log/main/current
  2001-07-09 07:38:43.675295500 tcpserver: status: 0/2
  2001-07-09 07:39:09.055404500 tcpserver: status: 1/2
  2001-07-09 07:39:09.097158500 tcpserver: pid 28174 from 192.168.0.211
  2001-07-09 07:39:09.870308500 tcpserver: ok 28174 s.in.usupi.org:...
  2001-07-09 07:39:11.819740500 tcpserver: end 28174 status 256
  2001-07-09 07:39:11.822338500 tcpserver: status: 0/2

さらに脱線しますが、tcpserver にアクセス制御を行わせることもできます。
tcprules コマンドでその規則を生成し、tcpserver のオプションで生成した 規則を指定すれば、規則で許可したところからのみ接続可能とします。
以下はその例です。

  # mkdir /usr/local/etc/tcpserver/rules
  # cd /usr/local/etc/tcpserver/rules
  telnet.txt の作成
  # tcprules telnet.cdb telnet.tmp < telnet.txt

tcprules コマンドは、テキストでかかれた規則を cdb 形式に変換するもの です。上記の telnet.txt は、例えば以下のようにします。

  192.168.0.:allow
  127.:allow
  :deny

ここでは、192.168.0/24 と localhost からの接続は許可し、それ以外は 拒否するという設定です。
tcpserver/rules ディレクトリに、以下のような makefile を置いておけば、 新規作成や編集後に make foo.cdb と実行するだけで cdb ファイルが生成 (あるいは更新)されます。

  .SUFFIXES: .txt .cdb

  .txt.cdb:
          tcprules $@ $<.tmp < $<

# 常に必要なものは、all: に書いておけばよいかもしれません。
あとは、tcpserver 起動時のオプションで指定します。

  % cat telnetd/run
  #!/bin/sh
  /usr/local/bin/tcpserver -vRH -c 2 \
        -x /usr/local/etc/tcpserver/rules/tcp.telnet.cdb \
        0 telnet /usr/libexec/telnetd 2>&1


4. 備考

service ディレクトリの下にディレクトリを掘ると、supervise が動き 出してしまい、run がないとかいろいろ文句をたれます。その数が半端では ないので、別の場所で作ってからシンボリックリンクした方が無難です。
いずれにしろ、run コマンドに問題があって無限にデーモンを起動し続けて しまったりなど、何か問題が起こった場合、以下で止められます。

  svc -d /usr/local/service/ほげほげ

問題を解決したら、以下で再開できます。

  svc -u /usr/local/service/ほげほげ

Powered by Apache PostgreSQL Usupi Logo Kuri Logo
[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [-]
usu@usupi.org Last modified : Mon Sep 30 12:19:54 2019