fla*_*kes 8 linux redhat systemd
我有一个foo.service
依赖于 service 的服务bar.service
。我需要确保bar.service
之前启动foo.service
并bar.service
成功启动。
从这个来源它说Requires
:
该指令列出了该单元本质上依赖的任何单元。如果当前单位被激活,此处列出的单位也必须成功激活,否则该单位将失败。默认情况下,这些单元与当前单元并行启动。
那After
:
此指令中列出的单元将在启动当前单元之前启动。这并不意味着依赖关系,如果需要,必须通过上述指令建立依赖关系。
在同一个单元文件中同时包含Requires
和After
部分是否正确?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.service
Requires=
foo.service
bar.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)
归档时间: |
|
查看次数: |
6858 次 |
最近记录: |