Unix Daemon Foundations

Like many other people, I have noticed that the core Unix ideals of simplicity and reliability have not been followed in modern featureful packaged systems, e.g., Red Hat and Debian Linux. In their attempt to be modular, they introduce such abominations as "start-stop-daemon", that fish around in the process table in their earnest effort to make up for deficiencies in the init program.

Fortunately, some programmers have not only complained about this situation, but written solid code that is both modular and reliable. This page indexes known (to me) programs in this category. All this code follows the Debian Free Software Guidelines, with the notable exception of Dan Bernstein's work. Dan's efforts are much appreciated, and have clearly inspired a generation of programmers.

Unlike the SystemV init script concept, all of these approaches share a common strategy: daemons are started under the supervision of a master, and do not detach themselves from that parent (note to daemon authors: this means you need to at least provide an option to not self-daemon). The PID of that daemon is known to the supervisor process: it is, after all, returned by the unix fork() system call. If the daemon ever needs to be sent a signal, such as killing it at system shutdown, the supervisor process can do so easily. Another common strategy is that error messages are routed through normal unix pipes, just like shell redirection uses. A common system-wide log (syslog, usually /dev/log) is not used.

Init replacements

Daemon management

Options for logging from stdin

Adapter from unix domain socket to above loggers

Single-port inetd replacements

Cron and substitutes

Other references

Clearly, many thanks are due to Dan Bernstein, Gerrit Pape, and all the other authors of this code. The web server (boa) process that gave you this page is managed by runit.

Larry Doolittle
June 23, 2005