systemd "After="在启动服务之前是否会检查里面的服务是否启动无故障?

systemd "After="在启动服务之前是否会检查里面的服务是否启动无故障?

例子:

bar.service:

[Unit]
After=foo.service

如果 foo.service 没有正确启动,bar.service 会启动吗?如果 foo.service 不依赖任何东西并且永远不会启动怎么办?

答案1

您应该将After=x其视为含义:

  • 完成工作“x”后开始执行此工作。
  • 它不指示任何有关执行作业“x”的结果的信息,它仅指示等待此作业,直到执行作业“x”。

man systemd.unit:

最重要的是,对于服务单元来说,Before=After=所有配置的启动命令都已被调用并且它们失败或报告启动成功时,启动被视为已完成。请注意,这确实包括ExecStartPost=(或 ExecStopPost=对于关闭情况)。

请注意,这些设置独立于并正交于Requires=Wants=Requisite=或所配置的需求依赖关系BindsTo=。在After=和选项中包含单元名称是一种常见模式Wants=,在这种情况下,列出的单元将在配置了这些选项的单元之前启动。

所以这意味着:

  1. bar.service即使foo.service以失败状态结束,也会开始。
  2. 如果foo.service从未激活,bar.service则将一直等待,直到foo.service被其他单位以某种方式激活。
  3. bar.service由于未满足的依赖性,最终很可能会进入失败状态。
    用于等待的时间由其他设置控制,例如JobTimeoutSec=, JobRunningTimeoutSec=。 (看:如何更改systemd服务超时值?
    你可以用来JobTimeoutAction=抓住这个案例。
  • 编辑:废弃(2)和(3),因为它们仅适用于Requisite=foo.service,感谢您纠正我@TooTea

相关内容