我正在创建一个foo
启动/关闭上游包的包bar
。关系应该是:
- 当你启动 foo 时,也启动 bar。
- 何时停止/重新加载 foo,也停止/重新加载栏。
bar
可以在不影响的情况下启动、停止或重新加载foo
如果/lib/systemd/system/bar.service
看起来像这样:
[Unit]
Description=Bar
[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure
然后“正常”的解决方案是添加WantedBy
和PartOf
关系bar
:
[Unit]
Description=Bar
PartOf=foo.service
[Service]
ExecStart=/bin/sleep infinity
Restart=on-failure
[Install]
WantedBy=foo.service
但是,bar
它是一个上游包,我认为强制bar
了解foo
或修补bar
.
我认为一个完美的解决方案是这样创建foo.service
:
[Unit]
Description=Foo
Wants=bar.service
ConsistsOf=bar.service
[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes
但是我的 journalctl 说:
“单元”部分中的未知左值“ConsistsOf”
手册页说:
当在 a.service 上使用 PartOf=b.service 时,此依赖关系将在 b.service 的属性列表中显示为 ConsistsOf=a.service。ConsistsOf= 依赖项不能直接指定。
我不确定为什么 ConsistsOf=
不能直接指定,但有没有我没有考虑过的替代方案?
修改上游/外部 bar.service 以包含
PartOf=
与另一个单元的关系的适当方法是使用“插入式”覆盖配置,这是一个 systemd 功能,允许您修改现有单元而无需触及原始文件。从systemd.unit手册页:
在您的特定情况下,您应该创建一个插件,例如
/etc/systemd/system/bar.service.d/partof-foo.conf
, 内容:(名称
partof-foo.conf
只是一个建议,任何带.conf
后缀的都可以。)然后重新加载守护进程
systemctl daemon-reload
。完成后,您可以使用 来检查该单元
systemctl cat bar
,这将清楚地显示正在考虑覆盖。此外,现在,systemctl show foo
将显示与的ConsistsOf=
关系,bar.service
并且该关系的影响将随之而来(停止foo
将导致bar
停止。)对于第二部分(
foo
有Wants=bar.service
),我建议直接将该指令添加到,foo.service
而不是[Install]
在bar.service
.一方面,
[Install]
必须使用systemctl enable bar
命令激活该部分,因此在某种程度上它更难维护。(此外,我还看到[Install]
了不尊重“插入式”的错误。我相信这些错误已得到修复,但可能仍存在于您的发行版的 systemd 版本中。)此外,您可能希望使用更强的
Requires=
关系,而不是,因为如果无法启动Wants=
,这将导致foo.service
失败。bar.service
(考虑还添加一个排序依赖项,例如After=bar.service
fromfoo.service
,因此foo
实际上会等到bar
is up 后再进行自己的启动。)由于
foo.service
是您控制的文件,因此只需将其直接包含在其中:这是假设您也需要排序依赖项,如果您不这样做,则可以安全地省略它。
那应该照顾一切。