[译]New-Style Daemons

原文是 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 也被重置。新式守护进程的推荐实现方式如下:

实现步骤

  1. 如果收到 SIGTERM ,关闭 daemon 并干净地(cleanly)退出。
  2. 如果收到 SIGHUP ,在适合的情况下(if this applies),重新加载配置文件。
  3. 由主守护进程(main daemon process)提供正确的退出码,这被 init 系统用来检测服务 错误及问题。推荐遵从 LSB recommendations for SysV init scripts 中定义的退出码 方案。
  4. 如果可行且适合,通过 D-Bus IPC 系统将守护进程的控制接口曝露出来,并在初始化 的最后一步获取一个 bus name。
  5. 如果要集成到 systemd,提供一个包含开始、结束和其他维护守护进程的 .service unit 文件。更多细节查阅 systemd.service(5)
  6. 尽可能地依赖 init 系统提供的功能,限制守护进程使用文件、服务及其他资源。如在 使用 systemd 的情况下,依赖 systemd 的资源控制(resource limit control)而不要 自己实现,依赖 systemd 的特权删除代码(privilege dropping code)而不要在守护进 程里重新造轮子,等等。可用的控制请参阅 systemd.exec(5)
  7. 如果使用了 D-Bus,提供 D-Bus 服务激活配置文件使你的守护进程 bus-activatable。 这可以带来很多好处:你的守护进程可以按需(on-demand)推迟启动;它可以和其他依赖 它的守护进程并发启动──这可以最大化并行及加快启动速度;你的守护进程可以在出错 时重启而不会丢失任何 bus requests,因为 bus 会把针对 activatable 服务的请求加 入队列。详情参见下文(没译到那儿。。。)。
  8. 如果你的守护进程通过 socket 来对其他本地进程或远程客户提供服务,它应该根据下 文的方案被做成 socket-activatable。和 D-Bus activation 一样,这使得按需启动及 在启动时提高并行度成为可能。同样,对于无状态(state-less)协议(如 syslog, DNS) 来说,实现了 socket-based activation 的守护进程可以在被重启时不丢失请求。详情 参见下文。
  9. 如果合适,守护进程应该通过 sdnotify(3) 接口通知 init 系统启动完成或状态更 新。
  10. 与直接使用 syslog() 调用将日志直接写入系统 syslog 服务不同,新式守护进程可以 选择通过 fprintf() 将日志直接输出到标准错误输出,init 系统会将它转发到 syslog。如果需要日志级别,可以通过在每行日志前加上类似“<4>”来实现(表示系统 日志级别 4 “WARNING”),和 Linux 内核中的 printk() 级别系统类似。更多细节请 参考 sd-daemon(3)systemd.exec(5) 。这些推荐和Apple MacOS X Daemon Requirements类似但又有所不同。
Last Updated 2018-05-26 Sat 14:12.
Render by hexo-renderer-org with Emacs 25.2.2 (Org mode 9.1.13)
0%