innwatch.ctl - List of supervisory actions taken by innwatch
The file
pathetc/innwatch.ctl is used to determine what actions are taken
during the periodic supervisions by
innwatch.
The file consists of a series of lines; blank lines and lines beginning with a
number sign ("#") are ignored. All other lines consist of seven
fields, each preceded by a delimiting character, for example:
!state!when!condition!test!limit!command!reason
or:
@state@when@condition@test@limit@command@reason
The delimiter can be any one of several non-alphanumeric characters that does
not appear elsewhere in the line; there is no way to quote it to include it in
any of the fields. Any of "!", ",", ":",
"@", ";", or "?" is a good choice. Each line can
have a different delimiter; the first character on each line is the delimiter
for that line. White space surrounding delimiters, except before the first, is
ignored, and does not form part of the fields; white space within fields is
permitted. All delimiters must be present.
The first field is the state to enter if the condition for this control line is
true. It is used as an internal state indicator and in
ctlinnd messages
to control the server. If this field is empty, the line number is used.
The second field specifies when this control line should be used. It consists of
a list of states and special indicators, separated by whitespace. If the
current state matches against any of the states in this field, this line will
be used as described below. The values that may be used are:
- "-"
- This line matches if the current state is the same as the
label on this line, or if the current state is "run", the
initial state. This is also the default state if this field is empty.
- "+"
- This line matches if the current state is
"run".
- "*"
- This line always matches.
- "label"
- This line matches if the current state is the specified
"label".
- "-label"
- This line matches if the current state is not the specified
"label".
The third field specifies a shell command that is invoked if this line matches.
Do not use any shell filename expansion characters such as "*",
"?", or "[" (even quoted, they're not likely to work as
intended). The command is executed with its current directory set to the news
spool articles directory (
patharticles).
If the command succeeds, as indicated by its exit status, it is expected to have
printed a single integer to standard output. This gives the value of this
control line, to be used below. If the command fails, the line is ignored.
The fourth field specifies the operator to use to test the value returned above.
It should be one of the two letter numeric test operators defined in
test(1) such as "eq", "lt" and the like. The
leading dash ("-") should not be included.
The fifth field specifies a constant with which to compare the value using the
operator just defined. This is done by invoking the command:
test value -operator constant
The line is said to
succeed if it returns true.
The sixth field specifies what should be done if the line succeeds, and in some
cases if it fails. Any of the following words may be used:
- "throttle"
- Causes innwatch to throttle the server if this line
succeeds. It also sets the state to the value of the line's label. If the
line fails, and the state was previously equal to the label on this line
(that is, this line had previously succeeded), then a "ctlinnd
go" command will be sent to the server, and innwatch will
return to the "run" state. The "ctlinnd throttle"
command is only performed if the current state is "run" or a
state other than the label of this line, regardless of whether the command
succeeds.
- "pause"
- Is identical to "throttle" except that the server
is paused via the "ctlinnd pause" command.
- "shutdown"
- Sends a "ctlinnd shutdown" command to the server.
It is for emergency use only.
- "flush"
- Sends a "ctlinnd flush" command to the
server.
- "go"
- Causes innwatch to send a "ctlinnd go"
command to the server and to set the state to "run".
- "exit"
- Causes innwatch to exit.
- "skip"
- The remainder of the control file is skipped for the
current pass.
The last field specifies the reason that is used in those "ctlinnd"
commands that require one. More strictly, it is part of the reason, as
innwatch appends some information to it.
In order to enable other sites to recognize the state of the local
innd
server, this field should usually be set to one of several standard values.
Use for instance "No space" if the server is rejecting articles
because of a lack of filesystem resources, or "loadav" if the server
is rejecting articles because of a lack of CPU resources.
Once
innwatch has taken some action as a consequence of its control line,
it skips the rest of the control file for this pass. If the action was to
restart the server (that is, issue a "ctlinnd go" command), then the
next pass will commence almost immediately, so that
innwatch can
discover any other condition that may mean that the server should be suspended
again.
!!! inndf . ! lt ! 10000 ! throttle ! No space (spool)
!!! inndf -i . ! lt ! 1000 ! throttle ! No space (inodes)
The first line causes the server to be throttled if the free space drops below
10000 units (using whatever units
inndf uses), and restarted again when
free space increases above the threshold.
The second line does the same for inodes.
The next three lines act as a group and should appear in the following order. It
is easier to explain them, however, if they are described from the last up.
! load ! load hiload ! loadavg ! lt ! 5 ! go ! loadav
: hiload : + load : loadavg : gt : 8 : throttle : loadav
/ load / + / loadavg / gt / 6 / pause / loadav
The final line causes the server to be paused if
innwatch is in the
"run" state and the load average rises to, or above, six. The state
is set to "load" when this happens. The previous line causes the
server to be throttled when
innwatch is in the "run" or
"load" state, and the load average rises above eight. The state is
set to "hiload" when this happens. Note that
innwatch can
switch the server from "pause" to "throttle" if the load
average rises from below six to between six and seven, and then to above
eight. The first line causes the server to be sent a "ctlinnd go"
command if
innwatch is in the "load" or "hiload"
state, and the load average drops below five.
Note that all three lines assume a mythical command "loadavg" that is
assumed to print the current load average as an integer. In more practical
circumstances, a pipe of
uptime into AWK is more likely to be useful.
The "run" state is not actually identified by the label with that
three letter name, and using it will not work as expected ("go" is
the wanted state in that case).
Using an
unusual character for the delimiter such as "(",
"*", "&", "`", "'", and the like,
is likely to lead to obscure and hard to locate bugs.
Written by <
[email protected]> for InterNetNews. Rewritten into POD by
Julien Elie.
ctlinnd(8),
inndf(8),
news.daily(8),
rc.news(8).