systemd 让服务 A 启动 B

systemd 让服务 A 启动 B

我用 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

相关内容