Daemontools

提供:Kaiseki
移動: 案内, 検索

目次

概要

デーモンプロセスの開始、終了、再起動、プロセスが落ちた場合の自動起動、といったデーモンプロセスの管理を行うためのプログラム群です。

インストール

daemontoolsのHPから wget等でパッケージを入手します。

 ソースを入手したら、How to install daemontoolsに従いインストールします。  ただし、そのままではエラーとなりインストールできませんので、下記のように行います。

1.Create a /package directory:

 mkdir -p /package
 chmod 755 /package
 chmod +t /package
 cd /package

2.Download daemontools-0.76.tar.gz into /package. Unpack the daemontools package:

 wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
 tar zxvf daemontools-0.76.tar.gz
 cd admin/daemontools-0.76

3.Compile and set up the daemontools programs:

  package/install <-- error

下記のように行う(ここを参考にしました)<-- error.hの修正をやったらこれいらない?

  sed -i 's/gcc -O2/gcc -O2 --include \/usr\/include\/errno\.h/g' src/conf-cc
  ./package/compile

 一応 src/error.hも修正(ここを参考にしました)

  vi src/error.h

  extern int errno;
  ↓
  #include <errno.h>

  ./package/install

4. installが実行されると下記ディレクトリとファイルが作成されます。

  • 新たに作成されるディレクトリ
  /service
  /command
  • 作成されるファイルおよびそのシンボリックリンク
  /package/admin/daemontools/command/下に実行ファイル
  /command/下にそのシンボリックリンク
  /usr/local/bin/下にさらにシンボリックリンク
  • その他
    • /etc/inittabファイルの末尾に次の1行が追加されます。
  SV:123456:respawn:/command/svscanboot

5. daemontoolsが適切に日付を処理できているかを確認します。出力の左と右で時間が同じであれば問題ありません。

 # cd /command/
 # date | ./tai64n | ./tai64nlocal
   2002-05-14 03:54:59.114461500 Tue May 14 03:54:59 JST 2002

 # date | sh -c './multilog t e 2>&1' | ./tai64nlocal
   2002-05-14 03:55:21.425022500 Tue May 14 03:55:21 JST 2002

設定

新規に superviseでプロセスを起動したい場合、svscanが監視しているディレクトリ(デフォルトでは /service)にサブディレクトリを作りスティッキービットを立てる作業を 5秒以内(実際にはもっと短い間隔)で終了させる必要があります。 svscanはディレクトリの属性変更を感知しないため、最初にサブディレクトリを見つけた際の属性をその後も引き継ぎます。

 これを回避するには、一気に一連の作業を行うか、/service以外のディレクトリで起動のためのディレクトリやファイルを用意しておき、準備が完了した時点で/service下にシンボリックリンクを作成するかです。

例)vsftpdを起動する。(ここ参照)

1. daemonを置くディレクトリを作成します。

 mkdir /var/daemon

2. vsftpd用のディレクトリを作成します。

 mkdir /var/daemon/vsftpd

3. multilogを使う場合は、log用のディレクトリを作成します。

 mkdir /var/daemon/vsftpd/log

4. vsftpd用のディレクトリにStickyビットを立てます。

 chmod +t /var/daemon/vsftpd

5. vsftpd用のディレクトリに runスクリプトを作成し、実行権を設定します。

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

sleep 10

exec env - PATH=$PATH \
/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf 2>&1
chmod +x /var/daemon/vsftpd/run

6. log用のディレクトリに runスクリプトを作成し、実行権を設定します。

  • multilogの引数には、ログ各行の先頭にTAI64N形式のタイムスタンプを付けるように「t」を指定し、次に出力先を指定します。 multilogのデフォルトでは、ファイルサイズが99999bytesになるとファイルのローテーションを行い、最大ファイル数10まで保管します。それ以上になった場合は、古いものから削除します。
  • 最大ファイルサイズ、最大ファイル保持数を変更するには次のようにします。
    • multilog t sサイズ nファイル数 出力先
      • ファイルサイズは4096~16777215の間で指定します。なお、ログを意味のないところで切らないために、最大ファイルサイズの最後の2000bytes以内に改行コードがあった場合にのみ、ログファイルのローテーションを行います。
      • multilogのそのほかの引数については、ここを参照してください。
#!/bin/sh
exec setuidgid root multilog t ./main
chmod +x /var/daemon/vsftpd/log/run

7. ログの出力先を準備し、実行権を設定します。

 mkdir /var/log/vsftpd
 chmod 700 /var/log/vsftpd

8. 作業が完了したら/serviceにシンボリックリンクを作成し、プロセスのステータスを確認します。

 ln -s /var/daemon/vsftpd /service/vsftpd

 svstat /service/vsftpd
 /service/vsftpd: up (pid 12562) 8 seconds

 svstat /service/vsftpd/log
 /service/vsftpd/log: up (pid 11938) 1836 seconds

9. uptimeが0や1を繰り返している場合は、runスクリプトの起動に失敗していることが考えられるので、/service/vsftpd/log に作成されたログ(この例の場合は /var/daemon/vsftpd/log/main/current)を頼りにタイプミスなどがないか確認します。

起動と終了

一時的させる場合

  • svc -d /service/サービス
 svc -d /service/vsftpd  
 svc -d /service/vsftpd/log

一時停止で svstat(状態表示コマンド)を実行すると、次のような結果が返ってきます。

 svstat /service/vsftpd
 /service/vsftpd: down 216 seconds, normally up

 svstat /service/vsftpd/log
 /service/vsftpd/log: down 203 seconds, normally up

開始する場合

  • svc -u /service/サービス
 svc -u /service/vsftpd  
 svc -u /service/vsftpd/log

再開させた後 svstat(状態表示コマンド)を実行すると、次のような結果が返ってきます。

 svstat /service/vsftpd
 /service/vsftpd: up (pid 12670) 9 seconds

 svstat /service/vsftpd/log
 /service/vsftpd/log: up (pid 12663) 3 seconds

参考

個人用ツール