INNWATCH.CTL(5)

名前
innwatch.ctl - innwatch によるサーバ管理制御ファイル

機能説明
/var/news/etc/innwatch.ctl は innwatch による周期的な監視で行われる処理を指定します。

このファイルは一連の行から構成されていて、空行や ``#'' で始まるコメントは無視されます。 すべてのその他の行は区切り文字で区切られた七つのフィールドからなります
    :label:state:condition:test:limit:command:reason

区切り文字はエントリ中で使用していないアルファベット文字以外のうちのいずれかとすることができます。 ただし、いずれのフィールドにもこの区切り文字自身を用いる方法はありません。 ``!''、``,''、``:''、``@''、``;'' あるいは ``?'' のいずれかを用いるのがよいでしょう。 各行毎に区切り文字を変えることができ、 各行の最初の文字がその行での区切り文字となります。 最初の文字を除いて区切り文字の前後のホワイトスペースは無視され、 ホワイトスペース自身が各フィールドとなることは無いため、 各フィールド中にホワイトスペースを記述しても構いません。 区切り文字は省略することはできません。

第一フィールドはその制御行のラベルです。 これは内部状態の識別子や、サーバを制御する ctlinnd の reason の一部として使用されます。 このフィールドが無ければ、行番号が使用されます。

第二フィールドは、どのような場合にその制御行を使用するかを指定します。 このフィールドはホワイトスペースで区切られたラベルと特別な識別子のリストで構成されます。 現在の状態がこのフィールドのいずれのラベルに一致すれば、 この行は次で説明するように使用されます。 使用可能な値は次のとおりです。

-   現在の状態がこの行のラベルと同じあるいは、現在の状態が初期状態の ``run'' の場合に一致します。 このフィールドが空の場合、これがデフォルトとなります。

+   現在の状態が ``run'' の場合に一致します。

*   すべての状態に一致します。

label
    現在の状態が ``label'' で指定したものに一致します。

-label
    現在の状態が ``label'' で指定したもの以外に一致します。

第三フィールドは制御行が一致した場合に実行されるシェルコマンドを指定します。 ``*''、``?'' あるいは ``['' のようにワイルドカードでファイル名を使用してはいけません(エスケープを用いても、意図したようにはなりません)。 終了ステータスによって、コマンドが正常終了したと判断すれば、 innwatch は、標準出力にコマンドの結果が整数で出力されることを期待しています。 この値は、この制御行の次のフィールドで使用することになる値となります。 コマンドがエラーとなれば、この制御行は無視されます。 コマンドは現在のディレクトリを記事のスプールディレクトリである /var/news/spool/articles に設定して実行されます。

第四フィールドは上記で得た値を調べるために使用する演算記号を指定します。 これは ``eq''、``lt'' 等のように test(1) で定義されている 2 文字の数式演算記号のうちのいずれかでなければいけません。 記号の前のダッシュ (``-'') を含めてはいけません。

第五フィールドは上記演算記号を使用して、得られた値と比較するときの定数を指定します。 この比較は、次のコマンドにより実行されます。
    test value -operator constant
真が得られれば、これは ``正常終了'' となります。

第六フィールドは正常終了の場合あるいは、 エラー(正常終了でない)の場合に行うことを指定します。 次のうちのいずれかのキーワードを使用することができます。

throttle
    正常終了の場合、 innwatch はサーバを throttle 状態にします。 この場合、状態をこの制御行のラベルに設定します。 エラーの場合に状態がこの制御行のラベルに相当していれば(すなわち、 この制御行は前回は正常終了していれば)、 サーバに go コマンドが送られ、 innwatch は ``run'' 状態に戻ります。 コマンドが正常終了したかどうかにかかわらず、現在の状態が ``run'' あるいはこの制御行のラベル以外となっている場合のみ、``throttle'' は行われます。

pause
    サーバを pause にする以外は ``throttle'' と同じです。

shutdown
    正常終了の場合、サーバに ``shutdown'' コマンドを送ります。 これは緊急の場合のみ使用します。 エラーの場合は何もしません。

flush
    正常終了の場合、サーバに ``flush'' コマンドを送ります。 エラーの場合は何もしません。

go  正常終了の場合、 innwatch はサーバに ``go'' コマンドを送り、``run'' 状態にします。 エラーの場合は何もしません。

exit
    正常終了の場合、 innwatch を終了させます。 エラーの場合は何もしません。

skip
    正常終了の場合、残りの制御ファイルをスキップします。 エラーの場合は何もしません。

最後のフィールドは ctlinnd コマンドに必要な reason を指定します。 より厳密には、これは reason の一部です — これ以外に、 innwatch が情報をいくつか追加します。 他のサイトにローカルの innd の状態を知らしめるためには、 通常このフィールドは一般的ないくつかの値のうちのいずれかとするべきでしょう。 ファイルシステムの資源が足りないという理由でサーバが記事を拒否する場合は、 ``No space'' を使用してください。 CPU の資源が足りないという理由でサーバが記事を拒否する場合は、 ``loadav'' を使用してください。

innwatch が制御行の結果として何らかの処理を行うと、残りの制御ファイルはスキップされます。 処理がサーバの再スタート(すなわち、``go'' コマンドを送った場合)、 次回の監視はほとんどの場合、しばらくして開始されるため、 innwatch はサーバを再度停止するような要因となる他の状態も見つけることができます。

使用例
    @@@df .|awk 'NR==2 {print $4}'@lt@10000@throttle@No space
    @@@df -i .|awk 'NR==2 {print $4}'@lt@1000@throttle@No space (inodes)

最初の行は、ディスクの空きが 10000 ユニット( df で使用する単位です)より少なくなれば、サーバを throttle し、 ディスクの空きがその値以上になれば再スタートします。

二番目の行は inode について同じことを行います。

次の三つの行は一まとまりで作用し、その順番でなければいけません。 しかし、最後の行からの方が説明が簡単なため、その順で説明します。
    !load!load hiload!loadavg!lt!5!go!
    :hiload:+ load:loadavg:gt:8:throttle:loadav
    /load/+/loadavg/ge/6/pause/loadav
最後の行は、 innwatch が ``run'' 状態でロードアベレージが 6 以上になればサーバを pause します。 これに一致すれば、状態は ``load'' になります。 その前の行は、 innwatch が ``run'' あるいは ``load'' 状態で、ロードアベレージが 8 より大きくなればサーバを throttle します。 これに一致すれば、状態は ``hiload'' になります。 ロードアベレージが、6 より低い状態から、6 から 7 の間へ上がり、その後 8 より大きくなれば、 innwatch はサーバを ``pause'' から ``throttle'' にすることができることに留意してください。 最初の行は、 innwatch が、``load'' あるいは ``hiload'' 状態で、ロードアベレージが 5 より小さくなれば サーバに ``go'' コマンドを送ります。

いずれの 3 行も架空のコマンドである loadavg を使用していて、現在のロードアベレージを整数として表示されるものとしています。 より現実的な環境では、 uptime の結果をパイプで awk に渡す方がより有効なものとなります。

バグ
このファイルは個々のサイト毎に作成する必要があり、 提供されているサンプルファイルは実際にはサンプル以上のものとはなりません。 ファイル内での記述はより共通の制御行を最初となるように並べれられていなければいけません。

``run'' 状態は実際にはその 3 文字のラベルで識別されるわけでは無く、 この 3 文字を制御行で使用しても期待したようにはなりません。

``(''、``*'、``&''、```''、``´'' 等のように``通常は使用しない''文字を使用すると、 文字の意味が曖昧になり、問題点の発見が難しくなるでしょう。

履歴
InterNetNews 用に <kre@munnari.oz.au> により記述されました。

関連項目
innd(8)、 ctlinnd(8)、 news.daily(8)