1. DJB/daemontools

1.1. ログつきサービスディレクトリを作る方法

答: サービスディレクトリのモードを 1755 (sticky)にします。 (これは 0.75 版以前の daemontools との互換性のためです。)

そして、サービスディレクトリに ./log サブディレクトリを 作ります。

svscan がデーモンからロギングプログラムへのパイプを作成して くれます。 ./run が以下のようで:

./log/run がこうだったすると:

generate-crucial-data からの出力は log-crucial-data に渡されます。 各プログラムは個々に監視されています: log-crucial-data が死んでも再起動されますし、 generate-crucial-data が死んでも再起動されます。

./log/run のロギングプログラムとしては multilogがお勧めです:

この例ではログの各行の行頭にタイムスタンプを追加して、結果を 自動切替えのログディレクトリ./log/main中に保存しています。

setuidgid を使うと、 ロギングプログラムを 非 root アカウントのもとで走らせられます:

それにはそのユーザが所有者である./log/main ディレクトリを 作っておく必要があります。 multilog には ./log/mainを作成できない (させない)でしょうから。

デーモンがログメッセージをファイル記述子 2 [標準エラー出力] に 出力するなら、 記述子 2を記述子 1 [標準出力] にリダイレクトするように ./run 中に書きます:

バックグラウンドにまわるデーモンを監督する inetd を走らせると、シェルスクリプトは直ちに終了してしまい、 supervise が再起動するということを繰返します。

答: 根本的解決はデーモンを修正することです。 すべてのデーモンをバックグラウンドで実行するように作るというのは、 悪いソフトウエア設計法です。

fghack を使うことで、強制的にフォアグラウンドで走らせることができる デーモンもあります:

fghackのもとで動作するデーモンに対しては supervise はシグナルを送ることはできないことに注意しましょう。

fghack はデーモンからのパイプを作成して、 パイプが閉じられるまでデータを読みつづけます。 通常、デーモンのすべての子孫のプロセスは親デーモンが開いた パイプを継承しますので、子孫がすべて終了するまでは、パイプは開いたままです。

しかしながら、デーモンが余分のファイル記述子を閉じてしまうときには fghackも早々に終了してしまいます。 これらのデーモンのうち、 使わないのにファイル記述子 0 を開いたままにするものもあります。 それらは

とすればうまくいくかもしれません。

1.2. whois

1.3. history


CategoryDns CategoryWatch CategoryTemplate

MoinQ: DJB/daemontools/サービスの作成 (last edited 2022-09-04 00:12:37 by ToshinoriMaeno)