确定任何给定应用程序使用什么类型的 systemd 服务的方法

确定任何给定应用程序使用什么类型的 systemd 服务的方法

Type我认为我对 systemd 可以配置的不同服务有相对较好的处理(例如simpleoneshot等等)。

文档提供了相当合理的概述和选项描述。通常可以“猜测”可能的最佳选择并进行“反复试验”来确认。对于我非常熟悉的应用程序尤其如此。

但是,我担心在“反复试验”测试期间可能会出现我没有考虑到的情况(即边缘情况错误的风险)。因此,我正在寻求有关测试/调查应用程序的方法的建议,以确定它可能是最好的Type

FWIW,我正在考虑某种方法来手动启动应用程序并跟踪它的响应方式,无论它是否分叉(多个进程等)。我觉得一定有一些我缺少的相对简单的方法(使用标准命令行工具)来做到这一点。

我不确定它是否相关,但 Debian 是我选择的发行版。

答案1

(复制自我在 Super User.SE 上的回答。

当您从命令行手动启动服务时(不使用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

相关内容