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
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
Also, for all I know, many of the software packages listed below also use this newer communication method.