Systemd:同时使用After和Requires

时间:2016-11-14 16:17:55

标签: linux redhat systemd

我的服务foo.service取决于服务bar.service。我需要确保在bar.service之前启动foo.service并且bar.service已成功启动。

this source开始,Requires

  

该指令列出了该单位所依赖的任何单位。如果激活当前单位,则此处列出的单位也必须成功激活,否则此单位将失败。默认情况下,这些单位与当前单位并行启动。

After

  

此指令中列出的单位将在启动当前单位之前启动。这并不意味着依赖关系,如果需要,必须通过上述指令建立依赖关系。

同一个单元文件中同时包含RequiresAfter部分是否正确? Requires表示该服务将同时启动,但After表示它将在之前启动。如果在bar.service条件期间After无法启动,它是否会在Requires部分期间再次启动它?如果是这样,我需要找到另一种方式来启动foo.service

foo.service

[Unit]
After=bar.service
Requires=bar.service

2 个答案:

答案 0 :(得分:2)

尽管Umut的答案是正确的,但是Requires=After=之间的相互作用很少被阐明。来自systemd.unit#Requires=(重点是我的):

如果激活了此设备,列出的设备也将被激活。如果其他单元之一无法激活,并且设置了对故障单元的排序依赖性After= ,则该单元将不会启动。

从本质上讲,这意味着没有After=时,如果foo.service被启动(由于Requires=),两个服务都将被启动,但是如果{ {1}}无法成功启动。

但是,添加了foo.service后,它将在开始{{1}之前等待bar.service成功启动(有一些例外;请参阅After=文档中的注释)。 },如果bar.service没有启动,则不会启动。

Requires=foo.service之间的区别有些相关(请参见上面链接的文档)。

答案 1 :(得分:1)

同时使用After=Requires=完全没问题。他们有不同的目的。 Requires=设置启动依赖项。 systemd确保如果任何正在尝试启动foo.service,它也应该启动bar.service。如果bar.service在某些时候失败,那么foo.service也会被删除。

After=正在服务之间设置启动顺序。如果两个服务都计划启动,那么After=会确保设置启动顺序。

您可以查看systemd自己的服务文件作为示例。

/lib/systemd/system/basic.target
[Unit]
...
Requires=sysinit.target
After=sysinit.target
...