我正在创建一个systemd .service文件,我需要帮助理解Requires=
和After=
之间的区别。手册页说Requires=
“配置其他单元上的需求依赖项”。和After=
“配置单元间的顺序依赖关系。有什么关系呢?
发布于 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=并不重要。只要一个被关闭,另一个被启动,这两个中的哪一个被关闭也不重要。在所有情况下,在启动之前都会下令关闭。如果两个单元之间没有排序依赖关系,则它们将同时关闭或启动,并且不会发生排序。
发布于 2018-09-18 00:43:54
其中一个主要的区别是,
After
只检查该单元是否已经激活,并且没有显式地激活指定的单元。Requires
中列出的单元与单元一起激活。如果任何所需的单元无法启动,则该单元未被激活。假设我有一个单元文件test-app.service
,
[Unit]
Description=test app
After=network-online.target
下面是执行此语句时所发生的情况,
After
检查是否是network-online.target
。network-online.target
未启动,它将等待。test-app
只有在network-online.target
激活后才会启动。如果我有Requires
,
[Unit]
Description=test app
Requires=network-online.target
下面是执行此语句时所发生的情况,
network-online.target
和test-app
一起被激活network-online.target
无法启动,test-app
将不会被激活。发布于 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)。
https://serverfault.com/questions/812584
复制相似问题