Systemd:需要与想要

Systemd:需要与想要

有什么区别吗需要想要在目标文件中?

[Unit]
Description=Graphical Interface 
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service

谢谢

答案1

正如 heemayl 在评论中指出的那样,手册页回答了您的问题。来自网络:

想要=

Requires= 的较弱版本。如果配置单元已启动,则将启动此选项中列出的单元。然而,如果列出的单位未能启动或无法添加到交易中,这不会影响整个交易的有效性。这是将一个单元的启动与另一个单元的启动挂钩的推荐方法。

需要=

配置对其他单元的需求依赖性。如果该单位被激活,此处列出的单位也将被激活。如果其他单位之一被停用或激活失败,则该单位将被停用。可以多次指定此选项,也可以在一个选项中指定多个空格分隔的单元,在这种情况下,将创建所有列出的名称的需求依赖关系。请注意,需求依赖性不会影响服务启动或停止的顺序。这必须使用 After= 或 Before= 选项独立配置。如果单元 foo.service 需要使用 Requires= 配置的单元 bar.service,并且没有使用 After= 或 Before= 配置排序,那么如果激活 foo.service,两个单元将同时启动,并且它们之间没有任何延迟。通常,使用 Wants= 而不是 Requires= 是更好的选择,以便使系统在处理故障服务时更加健壮。

请注意,此依赖性类型并不意味着当该单元运行时另一个单元必须始终处于活动状态。具体来说:失败的条件检查(例如 ConditionPathExists=、ConditionPathExists=、... — 见下文)不会导致具有 Requires= 依赖性的单元的启动作业失败。此外,某些单元类型可能会自行停用(例如,服务进程可能决定完全退出,或者设备可能被用户拔出),这不会传播到具有 Requires= 依赖性的单元。将 BindsTo= 依赖类型与 After= 一起使用,以确保一个单元永远不会处于活动状态,而没有特定的其他单元也处于活动状态(见下文)。

来自freedesktop.org 页面

您的服务只有在以下情况下才会启动多用户目标已达到(我不知道如果您尝试将其添加到该目标会发生什么?),systemd 将尝试启动显示管理器.service与您的服务一起。如果显示管理器.service无论出于何种原因失败,您的服务仍将启动(因此,如果您确实需要显示管理器,请使用Requires=它)。如果多用户目标但是,如果未达到,您的服务将不会启动。

你们的服务是什么?它是一个信息亭系统吗?直觉上我想你想将你的服务添加到 multi-user.target (因此它在启动时启动),并让它严格依赖于显示管理器.service通过Requires=display-manager.service。但现在这只是疯狂的猜测。

答案2

我们的服务器部署使用包含所有用户 ID 和自动挂载映射的 LDAP。用户主目录是 NFS 挂载的,用户通常使用其主目录中的可执行代码创建 @reboot cronjobs。我们还使用 sssd 进行缓存。不用说,我们高度依赖能够提供确定性的启动顺序以使此配置正常工作。我们开发了一个非常简洁的 systemd 配置,并发现了“wants”和“requires”部分选项之间的细微差别。

如果某个服务在启动过程中出现故障,并且有另一个服务依赖于该服务的“requires”,并且将“restart=always”设置为服务选项,则该依赖服务将不会重新启动。但是,如果您有“想要”作为选项,则相关服务将按预期重新启动。

相关内容