D. J. Bernstein
UNIX
daemontools

supervise プログラム

supervise はサービスを開始させ、監視します。

使い方

     supervise service

supervise はディレクトリ service に移動し、./run を起動させます。 ./run が終了したら、./run を再起動させます。 ./run がすぐに終了したときに起動・終了の繰り返しを防ぐために ./run を起動させる前に1秒間待ちます。

ファイル service/down が存在すれば、supervise はすぐに は ./run を起動させません。 svc を使って ./run を起動させ、supervise へ別なコマンドを与えることができます。

supervise はディレクトリ service/supervise でバイナリ形式で状態の情報を保持します。そのディレクトリは supervise が書き込み可能でなければなりません。 状態の情報は svstat を使って読むことができます。

supervise は起動後にすぐに終了することがあります。service に必要なファイルが見つからない場合、あるいは 別の superviseservice ですでに動いている場合です。 supervise は一度でもうまく動いたら、kill されるあるいは特に終了の指示が出されるということが無い限り終了しません。 svok を使って、supervise がうまく動いているか調べられます。svscan を使って supervise プロセスの集まりを安全に開始できます。

バージョン 0.70 で加わったこと: supervise./run を起動させた後に1秒間待ちます。

./run の書き方

普通は ./run はシェルスクリプトです。例:
     #!/bin/sh
     exec clockspeed
ここの execsh に対し、clockspeed で自身を置き換えることを指示しています。これにより、svc を使って、clockspeed に直接シグナルを送ることができるようにしています。

サービスをバックグラウンドで走らせては「いけない」ことに注意してください。

     #!/bin/sh
     # will be repeatedly restarted by supervise
     exec clockspeed &
fghack を使って、自身をバックグランドにおくプログラムを supervise に監視させる(制御はしない)ことができます。
     #!/bin/sh
     exec fghack inetd

root 権限があれば、 setuidgidを使って、別アカウントのもとでサービスを起動させることができます。

     #!/bin/sh
     exec \
     setuidgid qmaill \
     multilog t ./main '-*' '+* status: *' =status

シェルのパイプラインを使うのは一般にはいいことでありません。

     #!/bin/sh
     generate-crucial-data | save-crucial-data
save-crucial-data が起動に失敗すると、 generate-crucial-dataによりすでにパイプに出されたデータは 捨てられてしまうでしょう。 svscanを使えば、以下のようにsupervise下のプロセス群の パイプラインを安全に開始できます。 ./run には
     #!/bin/sh
     exec generate-crucial-data
そして、./log/runには
     #!/bin/sh
     exec save-crucial-data
とします。

./run の書き換え方

./run が突然死んだら、すぐに supervise./run を再起動させます。そのため、サービスの起動中に ./run を直接編集することは安全ではありません。 ここでは三つの解決法を示します。 サービスによっては(fghackを使うものをすべて含む) superviseからのシグナルでは制御できずに 他の方法で止めなければならないものもあるということに注意してください。

./runで処理するために superviseにパイプで渡されるデータもあります。 多くのプログラムは TERM シグナルを受け取ると入力済の未処理データを 処理しないで捨ててしまうことに注意してください。 しかし、 multilog プログラムは 読み込んだ全データを終了前に処理するように念いりに設計されています。


訳:滝澤 隆史
(Version 0.61 における前野 年紀 氏による訳をベース)
Last modified: Sun Apr 16 20:42:26 2000