systemd 分叉 vs 简单?

lee*_*wah 44 systemd redhat-enterprise-linux

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

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

有什么指导方针吗?

tel*_*coM 80

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

a)如果服务启动并继续运行,并且提示不会返回,直到您按 Control-C 或以其他方式停止服务:那么Type = simple(或者Type = exec如果您的版本systemd有它)是正确的选择。

Type = simple和之间的实际区别Type = exec主要在于错误检测:Type = simple一旦 systemd 为其创建fork()了一个新进程,它将继续执行其他作业,因此即使调用实际Exec=命令失败,它也可能允许相关的事情继续进行。另一方面,Type = exec将检查Exec=命令是否被成功调用,如果没有则报告失败。

因此,如果您systemd足够新来支持Type = exec,您可能更喜欢使用它来Type = simple进行更好的错误检查。但是,如果你需要引导到尽可能快地进行,你的服务的启动故障的快速检测是不是必需的,和/或你想与旧版本兼容systemd,你仍然可以使用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.

  • 那么,您将如何手动启动它?或许可以通过以 root 身份运行 `apachectl start` 吗?尝试这样做,看看会发生什么。然后从我的答案中选择 a)、b) 或 c)。我敢打赌提示会返回并且 Apache 仍在运行,因此 b) 将是答案。 (2认同)
  • 添加了“Type=notify”的说明。 (2认同)