1. DJB/daemontools
Contents
1.1. ログつきサービスディレクトリを作る方法
答: サービスディレクトリのモードを 1755 (sticky)にします。 (これは 0.75 版以前の daemontools との互換性のためです。)
そして、サービスディレクトリに ./log サブディレクトリを 作ります。
- ロギングプログラムを走らせる./log/run スクリプトも作ります。
svscan がデーモンからロギングプログラムへのパイプを作成して くれます。 ./run が以下のようで:
- #!/bin/sh exec generate-crucial-data
./log/run がこうだったすると:
- #!/bin/sh exec log-crucial-data
generate-crucial-data からの出力は log-crucial-data に渡されます。 各プログラムは個々に監視されています: log-crucial-data が死んでも再起動されますし、 generate-crucial-data が死んでも再起動されます。
./log/run のロギングプログラムとしては multilogがお勧めです:
- #!/bin/sh exec multilog t ./main
この例ではログの各行の行頭にタイムスタンプを追加して、結果を 自動切替えのログディレクトリ./log/main中に保存しています。
setuidgid を使うと、 ロギングプログラムを 非 root アカウントのもとで走らせられます:
- #!/bin/sh exec setuidgid cruxlog multilog t ./main
それにはそのユーザが所有者である./log/main ディレクトリを 作っておく必要があります。 multilog には ./log/mainを作成できない (させない)でしょうから。
デーモンがログメッセージをファイル記述子 2 [標準エラー出力] に 出力するなら、 記述子 2を記述子 1 [標準出力] にリダイレクトするように ./run 中に書きます:
- #!/bin/sh
exec 2>&1 exec envuidgid tinydns envdir ./env softlimit -d300000 /usr/local/bin/tinydns
バックグラウンドにまわるデーモンを監督する inetd を走らせると、シェルスクリプトは直ちに終了してしまい、 supervise が再起動するということを繰返します。
答: 根本的解決はデーモンを修正することです。 すべてのデーモンをバックグラウンドで実行するように作るというのは、 悪いソフトウエア設計法です。
fghack を使うことで、強制的にフォアグラウンドで走らせることができる デーモンもあります:
- #!/bin/sh echo starting exec fghack inetd
fghackのもとで動作するデーモンに対しては supervise はシグナルを送ることはできないことに注意しましょう。
fghack はデーモンからのパイプを作成して、 パイプが閉じられるまでデータを読みつづけます。 通常、デーモンのすべての子孫のプロセスは親デーモンが開いた パイプを継承しますので、子孫がすべて終了するまでは、パイプは開いたままです。
しかしながら、デーモンが余分のファイル記述子を閉じてしまうときには fghackも早々に終了してしまいます。 これらのデーモンのうち、 使わないのにファイル記述子 0 を開いたままにするものもあります。 それらは
- #!/bin/sh
exec fghack baddaemon <&-
とすればうまくいくかもしれません。
1.2. whois