例子:
bar.service
:
[Unit]
After=foo.service
如果 foo.service 没有正确启动,bar.service 会启动吗?如果 foo.service 不依赖任何东西并且永远不会启动怎么办?
答案1
您应该将After=x
其视为含义:
- 完成工作“x”后开始执行此工作。
- 它不指示任何有关执行作业“x”的结果的信息,它仅指示等待此作业,直到执行作业“x”。
最重要的是,对于服务单元来说,
Before=
当After=
所有配置的启动命令都已被调用并且它们失败或报告启动成功时,启动被视为已完成。请注意,这确实包括ExecStartPost=
(或ExecStopPost=
对于关闭情况)。请注意,这些设置独立于并正交于
Requires=
、Wants=
、Requisite=
或所配置的需求依赖关系BindsTo=
。在After=
和选项中包含单元名称是一种常见模式Wants=
,在这种情况下,列出的单元将在配置了这些选项的单元之前启动。
所以这意味着:
bar.service
即使foo.service
以失败状态结束,也会开始。- 如果
foo.service
从未激活,bar.service
则将一直等待,直到foo.service
被其他单位以某种方式激活。 bar.service
由于未满足的依赖性,最终很可能会进入失败状态。
用于等待的时间由其他设置控制,例如JobTimeoutSec=
,JobRunningTimeoutSec=
。 (看:如何更改systemd服务超时值?)
你可以用来JobTimeoutAction=
抓住这个案例。
- 编辑:废弃(2)和(3),因为它们仅适用于
Requisite=foo.service
,感谢您纠正我@TooTea