首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在systemd中,After=和Requires=有什么区别?

在systemd中,After=和Requires=有什么区别?
EN

Server Fault用户
提问于 2016-11-01 20:04:36
回答 4查看 171.2K关注 0票数 118

我正在创建一个systemd .service文件,我需要帮助理解Requires=After=之间的区别。手册页Requires=“配置其他单元上的需求依赖项”。和After=“配置单元间的顺序依赖关系。有什么关系呢?

EN

回答 4

Server Fault用户

回答已采纳

发布于 2016-11-01 20:25:29

After=配置服务顺序(只在Y之后执行X),而Requires=状态依赖项。

如果您不指定订单,则依赖于另一个订单的服务将与它所依赖的服务同时启动。

而且,我理解它的方式(虽然我现在不能测试它,也找不到引用),After=是“松散耦合”,这实际上意味着即使在After=行中命名的服务根本没有启动,带有After语句的服务仍然会运行,而如果不满足需求,Requires=将阻止它的启动。

引用https://www.freedesktop.org/software/systemd/man/systemd.unit.html

Requires=配置其他单元上的需求依赖项。如果这个单位被激活,这里列出的单位也将被激活。如果其他单元中的一个被停用或激活失败,则此单元将被停用。该选项可以指定不止一次,或者可以在一个选项中指定多个空格分隔的单元,在这种情况下,将创建所有列出的名称的需求依赖项。请注意,需求依赖关系不会影响服务启动或停止的顺序。这必须使用After=或Before=选项独立配置。如果单元foo.service需要使用Requires=配置的单元bar.service,并且没有使用After=或Before=配置排序,那么如果foo.service被激活,这两个单元将同时启动,并且它们之间不会有任何延迟。通常,使用Wants=而不是Requires=来实现一个在处理失败服务时更加健壮的系统是一个更好的选择。

Before=,After=用空格分隔的单元名称列表.配置单元之间的顺序依赖关系。如果一个单元foo.service包含一个设置Before=bar.service,并且两个单元都正在启动,bar.service的启动将延迟到foo.service启动。请注意,此设置独立于Requires=配置的需求依赖项并与之正交。在After=和Requires=选项中都包含一个单元名称是一种常见的模式,在这种情况下,列出的单元将在使用这些选项配置的单元之前启动。可以多次指定此选项,在这种情况下,将为所有列出的名称创建顺序依赖项。After=与Before=相反,即After=确保所配置的单元在列出的单元启动后启动,而Before=则确保相反,即在列出的单元启动之前已完全启动所配置的单元。请注意,当两个具有排序依赖关系的单元被关闭时,将应用启动顺序的逆序。也就是说,如果一个单元在另一个单元上配置了After=,则如果两个单元都被关闭,前者将在后者之前停止。如果两个单元之间有任何排序依赖关系,如果一个单元被关闭,另一个单元启动,则在启动之前命令关闭。排序依赖是After=还是Before=并不重要。只要一个被关闭,另一个被启动,这两个中的哪一个被关闭也不重要。在所有情况下,在启动之前都会下令关闭。如果两个单元之间没有排序依赖关系,则它们将同时关闭或启动,并且不会发生排序。

票数 97
EN

Server Fault用户

发布于 2018-09-18 00:43:54

其中一个主要的区别是,

  • After只检查该单元是否已经激活,并且没有显式地激活指定的单元。
  • Requires中列出的单元与单元一起激活。如果任何所需的单元无法启动,则该单元未被激活。

假设我有一个单元文件test-app.service

代码语言:javascript
运行
复制
[Unit]
Description=test app
After=network-online.target

下面是执行此语句时所发生的情况,

  • After检查是否是network-online.target
  • 如果network-online.target未启动,它将等待。
  • test-app只有在network-online.target激活后才会启动。

如果我有Requires

代码语言:javascript
运行
复制
[Unit]
Description=test app
Requires=network-online.target

下面是执行此语句时所发生的情况,

  • network-online.targettest-app一起被激活
  • 如果network-online.target无法启动,test-app将不会被激活。
票数 40
EN

Server Fault用户

发布于 2019-02-13 15:21:05

systemd是一名职务经理。手册页对事物的工作方式并不十分精确。

启动时,systemd所做的是为锚作业(即default.target的启动作业)构建一个由作业组成的事务。所有这些依赖关系和关系所做的是定义如何和哪些作业将被触发。排序定义了工作(S),其他每一项工作都需要等待。因此,default.target单元处于所有这一切的中心,这就是为什么在启用单元时,您使用一个反向依赖项,通过systemctl启用该依赖项创建一个表示前向依赖系统的文件系统符号链接(这也是为什么您首先需要文件系统链接)。类似的情况是,当您手动启动某个单元时,则该单元为锚,事务被计算为wrt。

不太详细,我将解释Requires=和After=做什么。

当启动作业被触发时,Requires=将导致systemd触发所需单元的开始作业(显式地,或者通过依赖关系:内部没有区别)。它还具有触发停止作业的属性,当此单元停止时(注意:停止,而不是自行停止)或重新启动。这意味着,如果某些依赖项/systemctl导致它停止/重新启动,您也将停止/重新启动。然而,如果它自己陷入困境,你就不会停止,因为没有工作,而且没有系统的参与,状态改变就发生了。这就是您使用BindsTo=的地方(类似于设备单元,由于明显的原因,这些设备单元可以在没有systemd参与的情况下进入非活动状态)。

现在,推荐使用After=,因为只使用Requires=就行了:如果开始作业失败,请取消申请。但是,此取消只适用于wrt作业,即如果另一个单元不定义排序,systemd将并行触发,如果它的开始作业在开始作业失败之前完成,则不会被取消(事实上,它不能被取消)。使用After=意味着其他作业一直等待到所需单元的开始作业完成为止,如果结果失败,则使用JOB_DEPENDENCY作业结果取消单元的等待开始作业(为什么在启动时使用黄色依附 )。因此,不使用After=,这种失效效果是不确定的。

这就是为什么如果您不想等待另一个单元的启动,不使用Wants=而不使用After=是可以的:因为没有失效,所以没有竞争。在这种情况下,它不过是一种同步机制。

此外,您还可以在引导时启用这两种功能,而不需要彼此,并且只定义排序,在这种情况下,当两者作为同一事务的一部分被提取时,它们将被命令(或者,如果要运行的单元的作业在运行时被触发,那么它将首先等待它完成,跨事务)。

如果没有作业,订购对该单位没有任何影响。然而,由于使用了Requires=和Wants=这样的依赖关系,或者两个人一次都被拉进来并定义了一些顺序,通常会有一个作业,在这种情况下,他们会等待另一个单位的任务(S)。

票数 9
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/812584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档