如今,服务均由Debian 的旧实用程序进行管理systemd
或轻松包装。start-stop-daemon
init.d
有哪些情况更适合分叉?
答案1
自 2010 年以来,答案其实一直没有改变。
这取决于替代方案是什么:
如果你正在将预 systemd 守护程序转换为在 systemd .services 中运行,并且必须在“简单”和“分叉”之间进行选择,那么 Type=forking 比 Type=simple 具有明显的优势(假设守护程序同时支持这两种类型):它允许服务管理器知道服务何时初始化完成。也就是说,systemd 可以区分“活动”服务和“正在激活”的服务。
如果您有其他服务依赖于此服务,那么这可能会产生很大的不同。如果仅使用 Type=simple,它们可能会启动得太早,在此服务有时间读取配置、设置套接字、打开数据库等之前,这可能会导致依赖项失败。
(请注意,systemd 不是在进程分叉时将服务标记为“活动”,而是在其初始(父)进程时将服务标记为“活动”退出,即非常类似于从 shell 运行命令的行为方式。因此,上述内容也适用于其他 init 系统:例如,使用传统的 init.d 脚本,myservice --daemon
仍会让脚本知道守护进程需要一些时间来启动,但myservice &
会立即将其置于后台,并且脚本不会获得该信息。
但并非所有守护进程都能正确实现这一点——它们有时会在加载实际配置和其余配置之前尽早“守护进程化”。在这种情况下,Type=forking 不幸与 Type=simple 一样无用。)
但是如果将 Type=forking 与较新的 Type=notify 进行比较(这需要守护进程具有特殊支持 - 它必须通过套接字发送明确的通知),那么通常来说,forking 模式没有任何优势,因为 Type=notify 可以执行相同甚至更多操作。