I've just discovered that some of the documentation below is obsolete. In particular, the init
daemon that comes with the latest sysvinit package is more sophisticated than I've portrayed it to be. Although it seems that the current version is backward compatible with what's written here, it looks like it has some undocumented features which are very important for UPS support.
The control mechanism outlined below only allows powerd
to give init
one of two messages, namely powerfail
or powerok
. init
runs one command when it receives powerfail
, and another when it receives powerok
. This leads to complicated powerd
logic for dealing with low battery signals and other sorts of special situations.
Newer versions of init
(as of version 2.58, it seems) are more sophisticated. These versions can be signaled to run one of three
scripts. Thus, init
can have a powerfail
script for announcing a power outage, a powerfailnow
script for doing an immediate shutdown, and a powerok
script for halting any pending shutdowns. This is much cleaner than the gyrations one would have to go through with the mechanisms detailed below.
Although most of the discussion here assumes the old init
communication method, I just added two new sections where the authors uses the new communcation method. These are sections Trust Energy Protector 400/650 and APC Smart-UPS 700. The former is especially detailed. Both include a powerd.c
which signals init
to do an immediate shutdown when a low battery signal is received, as well as the relevant /etc/inittab
lines to make this work. Other than this, all I can tell you is to look at the source code for init
.
Also, for all I know, many of the software packages listed below also use this newer communication method.