我的服务foo.service
取决于服务bar.service
。我需要确保在bar.service
之前启动foo.service
并且bar.service
已成功启动。
从this source开始,Requires
:
该指令列出了该单位所依赖的任何单位。如果激活当前单位,则此处列出的单位也必须成功激活,否则此单位将失败。默认情况下,这些单位与当前单位并行启动。
和After
:
此指令中列出的单位将在启动当前单位之前启动。这并不意味着依赖关系,如果需要,必须通过上述指令建立依赖关系。
同一个单元文件中同时包含Requires
和After
部分是否正确? Requires
表示该服务将同时启动,但After
表示它将在之前启动。如果在bar.service
条件期间After
无法启动,它是否会在Requires
部分期间再次启动它?如果是这样,我需要找到另一种方式来启动foo.service
foo.service
[Unit]
After=bar.service
Requires=bar.service
答案 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
...