如果 After=/Requires= 中的依赖项不存在,systemd 是否会失败?

如果 After=/Requires= 中的依赖项不存在,systemd 是否会失败?

我有一项服务 A,它在有限数量的环境中运行,用于为主机配置一些文件。我还有另一项服务 B,它在所有环境中运行。如果它们都在同一环境中运行,我希望 B 依赖于 A(并且仅在 A 之后启动)。

我认为只需根据答案在 B 中添加一个After=AandRequires=A这里

  • After仅检查单位是否已经激活,并不明确激活指定的单位。
  • 列出的单元Requires与该单元一起激活。如果任何所需单元启动失败,则该单元不会被激活。

这似乎表明,这两个,After=Requires=,都是需要的,以确保在之前启动依赖关系(二)单位。

但是,如果指定的单元不存在,即在服务 A 未运行的环境中,会发生什么情况?依赖项是否无效?

答案1

至少从 systemd v219 开始:

  • 当 A 不存在时,向 B添加After=A是无害的;B 仍将启动。
  • 添加Requires=A到 B 是基本上无害当 A 不存在时;当 B 启动时,您会在日志中收到一条消息,内容如下:“无法为单元 b.service 添加依赖作业,忽略:未找到单元。”但 B 仍将启动。

请注意要求=选择与紧密相关类型=选项!

  • 如果服务 A 是“简单”类型(默认),则 systemd 会在 ExecStart 进程分叉后立即认为它已激活,即该服务已完成其工作!
  • 如果服务 A 是“分叉”类型,那么 systemd“将在父进程退出时考虑启动该单元”,这可能就是您在这种情况下想要的。

相关内容