【问题标题】:Systemd: Using both After and RequiresSystemd:同时使用 After 和 Requires
【发布时间】:2017-03-28 08:32:22
【问题描述】:

我有一个服务foo.service,它依赖于服务bar.service。我需要确保bar.servicefoo.service 之前启动并且bar.service 成功启动。

来自this source 它说Requires

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

还有那个After

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

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

foo.service

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

【问题讨论】:

  • 同时使用Requires(或Wants)和After应该是你要找的。这会强制执行顺序 (After) 和依赖关系 (Requires)。它不会在“Requires 部分”再次启动它(还要注意服务文件不会被执行而是被解析)。
  • @Whymarrh 好的,所以我认为这意味着拥有这两个指令将改变Requires 描述中提到的“默认”启动; "默认与当前单元并行启动"
  • 是的,另请参阅:Requires=

标签: linux redhat systemd


【解决方案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
...

【讨论】:

  • WantedBy 怎么样?在 /etc/systemd/system/default.target.wants/watchdog.service: [Unit] After=multi-user.target [Install] WantedBy=multi-user.target
【解决方案2】:

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

如果这个单位被激活,列出的单位也会被激活。如果其他单元之一未能激活,并且在失败单元上设置了排序依赖 After=,则该单元将不会启动。

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

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

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

【讨论】:

    猜你喜欢
    • 2017-12-26
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 2016-08-25
    • 2016-05-09
    相关资源
    最近更新 更多