模块之间的 systemd 依赖关系是否需要对称?

模块之间的 systemd 依赖关系是否需要对称?

假设我有两个模块:A和B。我想在B之前启动A。

  1. 只有一个配置文件就够了吗?
[Unit]
Before=B
  1. 只有B配置文件就够了吗?
[Unit]
Requires=A
After=A
  1. 或者也许依赖关系需要在两个文件中对称定义?

配置A

[Unit]
Before=B

配置B

[Unit]
Requires=A
After=A

推荐的和最低限度的做法是什么?

答案1

是的,一个就足够了(任何一边)。

想象一下您已经使用模块 B 多年了。然后突然你编写了一个附加模块 A。最重要的是,B 可能已经是一个未维护的模块,或者模块 B 是由某些外部方管理的商业产品,从许可的角度来看,更改其配置可能是被禁止的。

模块 A 可能会发生同样的问题,因此您只能控制 B...

如果您将第三个、第四个等模块混入其中,可能会出现另一个问题。维持对称变化可能会变得非常复杂。

答案2

正如白猫头鹰正确指出的那样:

Before=A如果在 中定义B.service,则无需指定After=BinA.service

这个答案为您提供了一些解释这一点的文档。

After=和之间的关系Before=是它们是“逆属性”。如果Before=是“正向”属性,则After=是“反向”属性。

man systemd.unit描述了这一点:

与第二个单位创建关系的单位设置通常显示在两个单位的属性中,例如在 systemctl show 输出中。在某些情况下,属性的名称与配置设置的名称相同,但并非总是如此。该表列出了通过某种依赖关系连接的两个单元上显示的属性,并显示“源”单元上的哪个属性对应于“目标”单元上的哪个属性。

然后,手册页提供了一个包含所有正向/反向关系的表:

“转发”属性 “反向”属性 使用地点 使用地点(反向)
之前= 之后= [单位]部分
之后= 之前= [单位]部分
需要= 必填者= [单位]部分 [安装]部分
想要= 通缉者= [单位]部分 [安装]部分
部分= 组成= [单位]部分 自动属性
绑定到= 绑定= [单位]部分 自动属性
必备条件= 必备条件= [单位]部分 自动属性
触发器= 触发者= 自动属性,请参阅下面的注释
冲突= 冲突者= [单位]部分 自动属性
传播重新加载= 重新加载传播自= [单位]部分
重新加载传播自= 传播重新加载=
正在关注= 不适用 自动属性

因此,WantedBy=[Install]部分中的设置会创建Wants=与所选单位的关系。

相关内容