定义
daemontools是一组用于管理Unix服务的命令行工具,其设计目标是把守护进程的启动、监控、重启和日志记录拆分为职责清晰的小程序[2]。它不依赖系统自带的init机制,而是通过一套约定好的目录结构和若干常驻进程来完成服务管理,因此可以运行在多种Unix类操作系统上[1]。
在这套工具中,一个被管理的服务对应一个服务目录,目录内至少包含一个可执行的run脚本,用来启动真正的服务程序;supervise在该目录中运行,负责启动脚本并在进程退出后重新执行它[3]。这种以目录约定代替集中配置的方式,使新增或移除一个服务只需要增删一个目录或符号链接[5]。
整个工具集采用C语言编写,最初以公有领域之外的自定义条款发布,后由作者于2007年12月28日明确置于公有领域[1][4]。
原理
daemontools的工作方式可以概括为「目录即服务」。svscan程序会周期性扫描一个服务目录(常见约定为/service),一旦发现某个子目录,就为其启动一个supervise进程;某个supervise进程若意外终止,svscan也会把它重新拉起,形成两级监控[6]。
supervise在被监控的服务目录下运行,执行其中的run脚本以启动服务,并持续关注子进程状态。服务进程退出后,supervise会再运行一次run,从而实现不间断的重启;它还通过目录下的控制管道接受外部指令,配合svc程序实现停止、暂停、继续和重启等操作[7]。
日志由multilog负责,它把标准错误输出收集到一个或多个日志中,可以为每行加上时间戳,按指定模式包含或排除匹配行,并自动轮转日志以限制磁盘占用;当磁盘写满时它会暂停并稍后重试,不丢弃已接收的数据[2]。日志通常也作为一个独立服务放在服务目录的log子目录中,由supervise一并管理,因此日志进程同样具备自动重启能力[5]。
发展历程
daemontools由D. J. Bernstein编写,用于管理Unix守护进程,其0.76版本发布于2001年7月12日,此后上游长期未再发布新版本[1]。它被作者视为对inittab、ttys、init.d、rc.local等传统启动方式的改进,目标是让服务的安装、首次启动、可靠重启和故障报警都更简单,并保持良好的可移植性[1]。
在发布初期,该软件的使用条款较为模糊。2007年12月28日,作者声明将daemontools包(即daemontools-0.76.tar.gz)放入公有领域,不再保留版权,发行版因此可以自由修改和再分发[4][8]。
此后围绕它出现了多个衍生版本。daemontools-encore由Bruce Guenter维护,在保持向后兼容的前提下增加了大量改进[9]。indimail-mta项目中的daemontools-x则是一个规模较大的重写版本,增加了systemd单元文件、额外svc动作、扫描间隔可配置等特性,并可作为容器环境下的init替代品[10]。
应用
daemontools的典型用法是把需要长期运行的服务软链接到/service等扫描目录中,由svscan和supervise接管其生命周期。例如Web服务器lighttpd就被建议以supervise方式运行,其服务目录中包含run脚本、配置文件目录以及负责日志的log子目录,再把该目录链接到svscan的扫描目录即可[5]。
在系统集成层面,各发行版提供了不同的接入方式。Gentoo的软件包说明中提到,可以通过svscan的init.d脚本启动,也可以经由inittab启动[11]。Slackware的构建脚本默认会修改/etc/inittab,并启动svscanboot,同时提示安装过程会创建/command、/package和/service等顶层目录[12]。
该工具集已被Debian、Ubuntu、NetBSD、FreeBSD、Guix等多个平台打包。Debian与Ubuntu中同时存在daemontools主包与daemontools-run包,后者负责服务监督方面的集成;NetBSD pkgsrc将其归入sysutils类别,FreeBSD端口则在安装选项中提供手册页与信号支持等开关[2][3][13]。
局限
daemontools的设计非常精简,功能范围也相应有限。它本身不提供服务之间的依赖排序、并行启动等编排能力,只保证单个服务被拉起并维持运行,复杂的启动顺序需要依赖脚本自行处理[10]。
它的上游版本自2001年的0.76版之后长期停滞,缺少对现代系统的适配,因而许多发行版在其基础上打包补丁,或改用衍生版本与替代方案[1][9]。Debian和NetBSD的包信息中同时把runit列为可选的替代品,说明在实际部署中它并非唯一选择[2][3]。
此外,安装daemontools通常会改动系统的启动配置并创建/command、/service等顶层目录,若这些目录已存在就需要额外处理;在FreeBSD端口的说明中,测试套件在NFS挂载的工作目录上会失败[12][13]。
参见
参考资料
- daemontools – Wikipedia [引用日期2026-10-14]
- 套件:daemontools(1:0.76-15 以及其他的) [引用日期2026-10-14]
- sysutils/daemontools - The NetBSD Packages Collection [引用日期2026-10-14]
- Frequently asked questions from distributors [引用日期2026-10-14]
- Running Lighttpd under daemontools/supervise¶ [引用日期2026-10-14]
- Meta Configuration of Package daemontools [引用日期2026-10-14]
- DJB daemontools [引用日期2026-10-14]
- The Debian init system general resolution returns [引用日期2026-10-14]
- sysutils/daemontools-encore - The NetBSD Packages Collection [引用日期2026-10-14]
- daemontools - collection of tools for managing UNIX services [引用日期2026-10-14]
- daemontools-0.76-r7 [引用日期2026-10-14]
- SlackBuilds Repository [引用日期2026-10-14]
- daemontools [引用日期2026-10-14]