我有一个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 的句柄。
编辑:我正在编辑Requires
,BindsTo
因为这是预期的功能。
它仍然不起作用。在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.B
service.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