我创建一个systemd。服务文件,我需要帮助理解之间的差异Requires=和After=。该手册页说,Requires=“对其他单位提供配置需求的依赖。” 和After=“配置单元之间的排序依赖关系”。有什么不同?
Sve*_*ven 69
After=配置服务顺序(仅在 Y 之后执行 X),同时Requires=状态依赖。如果您不指定顺序,则依赖于另一个服务的服务将与它所依赖的服务同时启动。此外,我理解它的方式(尽管我现在无法测试并且找不到参考)After=是一种“松散耦合”,如果After=行中命名的服务不是Requires=根本没有开始,如果不满足要求,则会阻止它的开始。
引用https://www.freedesktop.org/software/systemd/man/systemd.unit.html:
需要=
配置对其他单元的需求依赖。如果该单位被激活,此处列出的单位也将被激活。如果其他单元之一被停用或激活失败,则该单元将被停用。可以多次指定此选项,也可以在一个选项中指定多个空格分隔的单位,在这种情况下,将为所有列出的名称创建需求相关性。请注意,需求依赖性不会影响服务启动或停止的顺序。这必须使用 After= 或 Before= 选项独立配置。如果单元 foo.service 需要使用 Requires= 配置的单元 bar.service 并且没有使用 After= 或 Before= 配置排序,那么如果 foo.service 被激活,则两个单元将同时启动并且它们之间没有任何延迟。经常,
和
之前=,之后=
以空格分隔的单位名称列表。配置单元之间的排序依赖关系。如果单元 foo.service 包含设置 Before=bar.service 并且两个单元都正在启动,则 bar.service 的启动将延迟到 foo.service 启动。请注意,此设置独立于并正交于 Requires= 配置的需求依赖项。在 After= 和 Requires= 选项中包含单元名称是一种常见模式,在这种情况下,列出的单元将在配置了这些选项的单元之前启动。可以多次指定此选项,在这种情况下,将为所有列出的名称创建排序依赖项。After=是Before=的反义词,即After=保证配置的单元在列出的单元启动完成后启动,Before=则相反,即 在启动列出的单元之前,配置的单元已完全启动。请注意,当两个具有顺序相关性的单元关闭时,将应用启动顺序的倒数。即,如果一个单元在另一个单元上配置了 After=,如果两者都关闭,则前者在后者之前停止。给定两个单元之间具有任何顺序相关性,如果一个单元关闭而另一个单元启动,则在启动之前订购关闭。顺序依赖是 After= 还是 Before= 并不重要。两者中的哪一个被关闭也无关紧要,只要一个被关闭,另一个被启动。在所有情况下,都在启动之前命令关闭。如果两个单元之间没有顺序依赖关系,它们将同时关闭或启动,
小智 26
主要区别之一是,
After 仅检查该单元是否已被激活,而不会明确激活指定的单元。Requires与单位一起激活。如果任何所需的单元无法启动,则不会激活该单元。考虑我有一个单元文件test-app.service,
[Unit]
Description=test app
After=network-online.target
Run Code Online (Sandbox Code Playgroud)
这是执行此语句时会发生的情况,
After检查是否network-online.target.network-online.target没有启动,它会等待。test-app仅在network-online.target处于活动状态后开始如果我有Requires,
[Unit]
Description=test app
Requires=network-online.target
Run Code Online (Sandbox Code Playgroud)
这是执行此语句时会发生的情况,
network-online.target并test-app一起激活network-online.target启动失败test-app将不会被激活。systemd 是一个作业管理器。手册页对于事情的工作方式不是很精确。
当您启动时,systemd 所做的是为锚定作业构建一个包含作业的事务(即为 default.target 启动作业)。所有这些依赖关系和关系的作用是定义将如何触发以及触发哪些作业。排序定义了每个其他作业将等待的作业。因此,default.target 单元处于所有这些的中心,这就是为什么在启用单元时您使用反向依赖项,它通过 systemctl enable 创建一个文件系统符号链接,表示 systemd 可以遵循的前向依赖项(也是为什么您需要文件系统符号链接的原因)第一名)。类似的是,当您手动启动某个单元时,该单元是锚点,并通过它计算交易。
不会太详细,我将解释 Requires= 和 After= 的作用。
Requires= 将导致 systemd 在您触发启动作业时触发所需单元的启动作业(明确地,或通过依赖项:内部没有区别)。它还具有在此单元停止(注意:停止,不会自行停止)或重新启动时触发对您的停止作业的属性。这意味着如果某些依赖项/systemctl 导致它停止/重新启动,您也将停止/重新启动。但是,如果它自行关闭,您将不会停止,因为没有工作,并且状态更改在没有 systemd 参与的情况下发生。这就是您将使用 BindsTo= 的地方(类似于设备单元,出于显而易见的原因,它可以在没有 systemd 参与的情况下进入非活动状态)。
现在,推荐使用 After= ,因为 Requires= 单独用于它的作用:如果启动作业失败,则取消requiree。但是,此取消仅适用于wrt作业,即如果另一个单元未定义排序,则systemd会同时触发两者,并且如果其启动作业在您的启动作业失败之前完成,则不会被取消(实际上无法取消) . 使用 After= 意味着其他作业一直等待直到所需单元的启动作业完成,并且根据结果,如果失败,则您单元的等待启动作业将被取消并带有 JOB_DEPENDENCY 作业结果(为什么使用黄色 [DEPEND]在这种情况下启动时)。因此,如果不使用 After=,这种失效效果是不确定的。
这就是为什么如果您不想等待另一个单元的启动,则使用 Wants= 而没有 After= 就可以了:因为那里没有失效,所以没有竞争。在那种情况下,它只不过是一种同步机制。
此外,您还可以在启动时启用两者,而不需要彼此,并且只定义排序,在这种情况下,当两者都作为同一事务的一部分被拉出时,它们将被排序(或者如果另一个的作业被触发当它想要运行的单元的作业正在运行时,它将首先等待它完成,跨事务)。
现在,如果没有工作,则订购对所述单位没有影响。然而,通常会有一个工作,作为使用依赖项的结果,如 Requires= 和 Wants=,或者两者同时被拉入并定义一些排序,在这种情况下,他们确实在等待另一个单元的工作。
| 归档时间: |
|
| 查看次数: |
107968 次 |
| 最近记录: |