原文是 Linux manual 关于 daemon 的描述中的 New-Style Daemons 一节,可以通过命令
man 7 daemon
查看完整的描述。
正文
现代的 Linux 服务程序应该被实现为新式的守护进程(New-Style Daemons)。这使得在运行 时管理和控制他们更简单,同时也简化了实现。
实现新式守护进程时,所有实现 SysV 守护进程推荐的初始化步骤都没有必要实现了。新式 init 系统如 systemd 使得所有这些都变得多余了。而且,由于这些步骤中的一些会干扰进 程监控、文件描述符传递和其他一些 init 系统功能,反面推荐在作为新式服务程序执行时 不要执行这些操作。
新式 init 系统保证守护进程在一个干净的进程上下文中执行:保证环境块(environment
block)是干净的,signal handlers 和 mask 都被重置,且没有多余的文件描述符被传递。
守护进程会在他们自己的 session 中执行,除非特别设置过,标准输入/输出/错误输出也
都指向 /dev/null
。umask 也被重置。新式守护进程的推荐实现方式如下:
实现步骤
- 如果收到
SIGTERM
,关闭 daemon 并干净地(cleanly)退出。 - 如果收到
SIGHUP
,在适合的情况下(if this applies),重新加载配置文件。 - 由主守护进程(main daemon process)提供正确的退出码,这被 init 系统用来检测服务 错误及问题。推荐遵从 LSB recommendations for SysV init scripts 中定义的退出码 方案。
- 如果可行且适合,通过
D-Bus
IPC 系统将守护进程的控制接口曝露出来,并在初始化 的最后一步获取一个 bus name。 - 如果要集成到 systemd,提供一个包含开始、结束和其他维护守护进程的 .service unit 文件。更多细节查阅 systemd.service(5) 。
- 尽可能地依赖 init 系统提供的功能,限制守护进程使用文件、服务及其他资源。如在 使用 systemd 的情况下,依赖 systemd 的资源控制(resource limit control)而不要 自己实现,依赖 systemd 的特权删除代码(privilege dropping code)而不要在守护进 程里重新造轮子,等等。可用的控制请参阅 systemd.exec(5) 。
- 如果使用了 D-Bus,提供 D-Bus 服务激活配置文件使你的守护进程 bus-activatable。 这可以带来很多好处:你的守护进程可以按需(on-demand)推迟启动;它可以和其他依赖 它的守护进程并发启动──这可以最大化并行及加快启动速度;你的守护进程可以在出错 时重启而不会丢失任何 bus requests,因为 bus 会把针对 activatable 服务的请求加 入队列。详情参见下文(没译到那儿。。。)。
- 如果你的守护进程通过 socket 来对其他本地进程或远程客户提供服务,它应该根据下 文的方案被做成 socket-activatable。和 D-Bus activation 一样,这使得按需启动及 在启动时提高并行度成为可能。同样,对于无状态(state-less)协议(如 syslog, DNS) 来说,实现了 socket-based activation 的守护进程可以在被重启时不丢失请求。详情 参见下文。
- 如果合适,守护进程应该通过 sdnotify(3) 接口通知 init 系统启动完成或状态更 新。
- 与直接使用 syslog() 调用将日志直接写入系统 syslog 服务不同,新式守护进程可以 选择通过 fprintf() 将日志直接输出到标准错误输出,init 系统会将它转发到 syslog。如果需要日志级别,可以通过在每行日志前加上类似“<4>”来实现(表示系统 日志级别 4 “WARNING”),和 Linux 内核中的 printk() 级别系统类似。更多细节请 参考 sd-daemon(3) 和 systemd.exec(5) 。这些推荐和Apple MacOS X Daemon Requirements类似但又有所不同。