Systemd:同时使用 After 和 Requires

fla*_*kes 8 linux redhat systemd

我有一个foo.service依赖于 service 的服务bar.service。我需要确保bar.service之前启动foo.servicebar.service成功启动。

这个来源它说Requires

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

After

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

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

foo.service

[Unit]
After=bar.service
Requires=bar.service
Run Code Online (Sandbox Code Playgroud)

Ger*_*ard 13

虽然 Umut 的答案是正确的,但 和 之间存在着相互作用,Requires=After=这种相互作用却很少被阐明。来自systemd.unit#Requires=(重点是我的):

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

本质上,这意味着如果没有,则如果启动(因为),After=两个服务都会启动,但如果没有成功启动,systemd 不会停止。foo.serviceRequires=foo.servicebar.service

但是,添加后After=,它将等待bar.service成功启动(有一些例外;请参阅文档中的注释Requires=)然后再启动foo.service,如果不启动则不会启动bar.service

Requires=和之间的区别有些相关BindsTo=(请参阅上面链接周围的文档)。


Umu*_*mut 10

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
...
Run Code Online (Sandbox Code Playgroud)