![systemd 让服务 A 启动 B](https://linux22.com/image/212979/systemd%20%E8%AE%A9%E6%9C%8D%E5%8A%A1%20A%20%E5%90%AF%E5%8A%A8%20B.png)
我用 snap 安装了 docker。每次 snap 更新 docker 时,snap.docker.dockerd(默认)服务都会停止并在一段时间后启动。我有一个正在运行的 docker-compose 应用程序,因此每次更新我的应用程序都会崩溃。
由于错误,Docker compose 的选项重新启动对我不起作用(https://github.com/docker/for-win/issues/584)
所以我看到的唯一选择是使用 systemd 服务。这是(/etc/systemd/system/docker-compose-chebur.service):
[Unit]
Description=Docker Compose Chebur
Requires=snap.docker.dockerd.service
PartOf=snap.docker.dockerd.service
After=snap.docker.dockerd.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/home/maybephilipp/projects/chebur-docker
User=maybephilipp
Group=docker
ExecStartPre=/usr/bin/sleep 3
ExecStart=/snap/bin/docker compose -f chebur.docker-compose.yml up -d
ExecStop=/snap/bin/docker compose -f chebur.docker-compose.yml down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
操作系统:Ubuntu 20.04.4
我尝试了 BindsTo=、PartOf=、Requires= 但正如我在互联网上看到的那样,实际上,当 snap.docker.dockerd 从停止状态启动时,它们对启动我的服务没有帮助。
所以我的问题是:如何让我的服务在 snap 终止时启动,然后启动 docker 服务?
我的第二个想法是创建docker compose up -d
每 5 分钟或更短时间执行一次的 cron 选项卡。但这看起来很肮脏:(
答案1
您想将您的[Install]
部分更改为:
[Install]
WantedBy=multi-user.target
WantedBy=snap.docker.dockerd.service
然后重新运行systemctl enable docker-compose-chebur.service
。
你在玩Requires=
,BindsTo=
你几乎有正确的想法,但方向错误。你一直说“当docker-compose-chebur.service
开始的时候,我也要开始snap.docker.dockerd.service
”。但你需要相反的:当snap.docker.dockerd.service
启动时,启动docker-compose-chebur.service
“。因此你确实需要添加Wants=
, Requires=
,BindsTo=
来snap.docker.dockerd.service
代替。如果你只能修改这个服务, , 的相反Wants=
是Requires=
, WantedBy=
。RequiredBy=
这些只能在部分中设置[Install]
。 BoundBy=
不能设置在[Unit]
或[Install]
部分中,因为这样做通常是错误的,但如果有必要,您可以通过直接插入来完成。
这是您定义的所有关系的解释。也许您并不需要全部。
Requires=A.service
:当这个启动时,A.service
也会启动。如果After=
已设置(确实如此)并且A.service
无法启动,则不会启动。PartOf=A.service
:当A.service
停止/重新启动时,也会停止/重新启动。After=A.service
: 看Requires=
WantedBy=A.service
: 当A.service
启动时,也启动这个。与RequiredBy=
which相反的是Requires=
,这会跳过成功检查。
就你而言,我会检查是否snap.docker.dockerd.service
已经WantedBy=multi-user.target
。如果是这样,我会将该行放入[Install]
并简单地拥有WantedBy=snap.docker.dockerd.service
.
参考: https://www.freedesktop.org/software/systemd/man/systemd.unit.html