在 systemd 中,如何创建与带有参数的服务的依赖关系?

在 systemd 中,如何创建与带有参数的服务的依赖关系?

我有一个Type=notify服务 A 需要在服务 B 启动之前初始化。当服务 A 宕机时,服务 B 也需要跟进。问题是服务 A 的名称没有明确定义。这是[email protected]

这是我的服务单位B

[Unit]
Description=start and shutdown with Service A
[email protected]
[email protected]

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/myprogram --start
ExecStop=/usr/bin/myprogam --stop

服务 A 调用的一个示例是..

sudo systemctl start [email protected]

myarg实际上可能是任何东西,所以我很困惑如何在服务 B 中获取服务 A 的句柄。

编辑:我正在编辑RequiresBindsTo因为这是预期的功能。

它仍然不起作用。在sudo systemctl status service.B

service.B.service:3: 无法添加对 openvpn-client@service 的依赖项,忽略:未知错误 -22

编辑:部分解决方案。

我可以从模板服务引用 service.B 来创建所需的依赖项,而不是从 service.B 引用模板服务 (service.A)。

所以服务..一个单位..

[Unit]
Before=service.B
Requires=service.B

[Service]
Type=notify
ExecStart=/usr/sbin/some.program

因此,service.A 需要 service.B,并且应该在 service.B 之前启动。 这部分有效,但是,当服务 A 关闭时,服务 B 并未关闭。

答案1

你对如何做有误解系统作品。你的线路[email protected]线路服务.B.服务被错误使用。从中删除该行服务.B.服务并添加依赖项[电子邮件受保护]喜欢Requires=service.B.service

开始仔细阅读systemD文档,我建议从这里开始:

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

对你来说,最有趣的部分将从[单位] 部分选项。仔细读!

需要=

...

如果该单位被激活,列出的单位也将被激活。如果其他单元之一无法激活,并且设置了对失败单元的排序依赖性 After=,则该单元将不会启动。此外,无论是否指定 After=,如果其他单元之一显式停止(或重新启动),则该单元将停止(或重新启动)。

...

答案2

我可以从模板服务中引用来创建所需的依赖项,而不是从 引用模板服务 ( [email protected]) 。service.Bservice.B

所以[email protected]单位..

[Unit]
Before=service.B
Requires=service.B

[Service]
Type=notify
ExecStart=/usr/sbin/some.program
ExecStop=systemctl stop service.B

因此,[email protected]需要service.B并且应该在 之前开始service.B。另外,之前ExecStop停止。service.B[email protected]

我对这个解决方案并不完全满意。 ExecStop 看起来很老套,我宁愿创建依赖项,service.B因为它是我的,而不是,我的更改可以更新。我还没有学会如何引用依赖项的模板服务。service [email protected]

编辑:因为[email protected]不是我的,所以我的更改可以更新。所以更好的方法是使用 systemd 覆盖。

sudo systemctl edit [email protected]

[Unit]
Requires=service.B.service
Before=service.B.service

[Service]
# From docs, I think, options with lists need to be reset first
ExecStop=
ExecStop=systemctl stop service.B.service

相关内容