systemd 分叉与简单?

systemd 分叉与简单?

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

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

有什么指导吗?

答案1

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

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

Type = simple和之间的实际区别Type = exec主要在于错误检测:Type = simple一旦 systemdfork()为其创建了新进程,就会继续执行其他作业,因此即使调用实际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

相关内容