systemd分叉与简单?


25

我正在写我的第一个systemd单位文件。

对于Type,有一些选择:forkingsimple等等。我已经阅读了有关该主题的Redhat文档(表9.9),但是仍然不确定何时应该使用哪个选项。

有准则吗?

Answers:


48

当您从命令行手动启动服务时(不使用nohup前缀命令或&后缀在后台运行该服务,换句话说,只需运行您将ExecStart=.service文件行中放置的命令),会发生什么?

a)如果服务启动并保持运行,并且直到您按Control-C或以其他方式停止该服务时,提示才返回:这Type = simple是正确的选择。

b)如果提示返回但服务仍在后台运行(即服务自行守护自身),则Type = forking是正确的选择。

c)如果服务完成其工作并返回提示而没有任何运行(例如,该服务只是调整某些内核设置,向其他命令发送命令或执行类似操作),则Type = oneshot可能是正确的选择。在这种情况下,ExecStart服务的命令可能是“设置”某项的命令,并且ExecStop可能是“取消设置”该命令的相应命令。这种类型通常有益于RemainAfterExit=true,因此systemd将根据事物是最近“置入”还是“未置入”来跟踪该服务的“状态”。

其他Type值是特殊情况。例如,如果服务使用D-Bus连接,则Type = dbus可能是最佳选择。它systemd意识到了这一事实,然后systemd将通过D-Bus上该服务的存在来跟踪该服务(及其相关的任何内容)。

要使用Type = notify,该进程必须能够连接到环境变量中指定的Unix套接字,$NOTIFY_SOCKET并在必要时通过向该套接字写入消息来报告其状态。同样,服务文件应指定相应的NotifyAccess选项以授予对通知套接字的访问权限。

您可以使用命令行实用程序systemd-notify和C库函数sd_notify(3)来发送这些消息,但是如果这些都不适合您的要求,则可以实现自己的消息发送者。所需的消息非常简单,并且看起来像shell变量分配:例如,要通知服务已成功完成启动并准备服务任何传入请求,则该服务应将等效于的输出的字符串发送printf "READY=1\n"到套接字。请参阅man 3 sd_notify以获取有关已识别消息的更多详细信息。

注意:许多设计为可移植到许多Unix风格的系统上的服务应用程序在默认情况下可能会表现为b),但可以通过添加一个选项(通常称为“请勿分叉”,“保持运行”)来像a)一样工作。在前台”,“请勿守护”或类似内容)。在这种情况下,如果该选项没有其他副作用,则添加该选项并使用a)类型的行为将是更可取的systemd


假设我开始apache,应该使用哪种类型?
kittygirl,

2
好吧,您将如何手动启动它?apachectl start以root身份运行,也许吗?尝试做,看看会发生什么。然后从我的答案中选择a),b)或c)。我敢打赌提示会返回并且Apache仍在运行,所以b)将是答案。
telcoM

我非常喜欢您在回答中给出的解释。您是否愿意为这种情况添加另一种简单的英语解释Type=notify
Yankee

1
Type=notify添加的说明。
telcoM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.