## page was copied from DnsTemplate ##master-page:HelpTemplate = DJB/daemontools = <> <> == ログつきサービスディレクトリを作る方法 == 答: サービスディレクトリのモードを 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 <&- とすればうまくいくかもしれません。 == whois == {{{ }}} == history == {{{ }}} ---- CategoryDns CategoryWatch CategoryTemplate