假设我有两个模块:A和B。我想在B之前启动A。
- 只有一个配置文件就够了吗?
[Unit]
Before=B
- 只有B配置文件就够了吗?
[Unit]
Requires=A
After=A
- 或者也许依赖关系需要在两个文件中对称定义?
配置A
[Unit]
Before=B
配置B
[Unit]
Requires=A
After=A
推荐的和最低限度的做法是什么?
答案1
是的,一个就足够了(任何一边)。
想象一下您已经使用模块 B 多年了。然后突然你编写了一个附加模块 A。最重要的是,B 可能已经是一个未维护的模块,或者模块 B 是由某些外部方管理的商业产品,从许可的角度来看,更改其配置可能是被禁止的。
模块 A 可能会发生同样的问题,因此您只能控制 B...
如果您将第三个、第四个等模块混入其中,可能会出现另一个问题。维持对称变化可能会变得非常复杂。
答案2
正如白猫头鹰正确指出的那样:
Before=A
如果在 中定义B.service
,则无需指定After=B
inA.service
这个答案为您提供了一些解释这一点的文档。
After=
和之间的关系Before=
是它们是“逆属性”。如果Before=
是“正向”属性,则After=
是“反向”属性。
man systemd.unit
描述了这一点:
与第二个单位创建关系的单位设置通常显示在两个单位的属性中,例如在 systemctl show 输出中。在某些情况下,属性的名称与配置设置的名称相同,但并非总是如此。该表列出了通过某种依赖关系连接的两个单元上显示的属性,并显示“源”单元上的哪个属性对应于“目标”单元上的哪个属性。
然后,手册页提供了一个包含所有正向/反向关系的表:
“转发”属性 | “反向”属性 | 使用地点 | 使用地点(反向) |
---|---|---|---|
之前= | 之后= | [单位]部分 | |
之后= | 之前= | [单位]部分 | |
需要= | 必填者= | [单位]部分 | [安装]部分 |
想要= | 通缉者= | [单位]部分 | [安装]部分 |
部分= | 组成= | [单位]部分 | 自动属性 |
绑定到= | 绑定= | [单位]部分 | 自动属性 |
必备条件= | 必备条件= | [单位]部分 | 自动属性 |
触发器= | 触发者= | 自动属性,请参阅下面的注释 | |
冲突= | 冲突者= | [单位]部分 | 自动属性 |
传播重新加载= | 重新加载传播自= | [单位]部分 | |
重新加载传播自= | 传播重新加载= | ||
正在关注= | 不适用 | 自动属性 |
因此,WantedBy=
该[Install]
部分中的设置会创建Wants=
与所选单位的关系。