我有两个 systemd 单元 A 和 B,它们不应同时运行。两者都提供对相同资源的访问,但以不同的方式,并且其中一个处理“从外部”停止的方式不如另一个优雅。
如果我指定Conflicts=
它们之间的依赖关系,启动其中一个单元将停止另一个单元。我更喜欢一种更强的关系,类似于(在一个方向)Requsite=
:
- 如果 A 已经启动,则启动 B 应该会失败。
- 如果B已经启动,启动A应该触发停止B;如果失败,启动 A 也应该失败。
有办法做到这一点吗?
答案1
我最终这样做了:
在B.service
:
[Service]
ExecStartPre=/bin/systemctl stop A.mount
在A.mount
:
[Unit]
Requires=B-stopped.service
After=B-stopped.service
在B-stopped.service
:
[Service]
Type=oneshot
ExecStart=/bin/sh -c '! systemctl --quiet is-active B'