![从一个 systemd 计时器激活两个“oneshot”服务,以便它们相继启动](https://linux22.com/image/215425/%E4%BB%8E%E4%B8%80%E4%B8%AA%20systemd%20%E8%AE%A1%E6%97%B6%E5%99%A8%E6%BF%80%E6%B4%BB%E4%B8%A4%E4%B8%AA%E2%80%9Coneshot%E2%80%9D%E6%9C%8D%E5%8A%A1%EF%BC%8C%E4%BB%A5%E4%BE%BF%E5%AE%83%E4%BB%AC%E7%9B%B8%E7%BB%A7%E5%90%AF%E5%8A%A8.png)
我有两个服务快照:
- 一个创建快照的
- 发送快照的
第二个(发送)应该总是在之后执行第一个(创建)已完成。目前,类型为 的服务oneshot
同时运行。
服务定义如下(以下示例中确切使用的命令对于此问题并不重要,示例下方有详细要求):
- 创建快照的服务 (
pyznap.service
):[Unit] Description=Create ZFS snapshots Documentation=man:pyznap(1) Requires=local-fs.target After=local-fs.target [Service] Type=oneshot ExecStart=/usr/bin/pyznap snap
- 发送快照的服务 (
pyznap-send.service
):[Unit] Description=Send ZFS snapshots Documentation=man:pyznap(1) Requires=local-fs.target network-online.target After=local-fs.target network-online.target pyznap.service [Service] Type=oneshot ExecStart=/usr/bin/pyznap send
目前,它们是由单独的(且独立的)计时器触发的:
- 创建快照的计时器 (
pyznap.timer
):[Unit] Description=Run pyznap snap every 15 minutes [Timer] OnCalendar=*:0/15 Persistent=true [Install] WantedBy=timers.target
- 发送快照的计时器 (
pyznap-send.timer
):[Unit] Description=Run pyznap send every 15 minutes [Timer] OnCalendar=*:0/15 Persistent=true [Install] WantedBy=timers.target
补充笔记:
- 问题涉及到“如何配置多个 systemd 服务以使用一个计时器?,但是这个解决方案仍然同时运行服务
- 根据
systemd
设计,只能引用一项服务Timer.Unit
。 - 由于不同的要求,这些单元是分开的:
- 只有“发送”服务需要网络
- “创建”服务也必须在没有网络的情况下运行
- 如果不满足要求,我可以跳过这些服务
- “发送”服务应该运行之后立马之前的“创建”服务。
- 如果只有一个计时器:
- 计时器不能仅激活发送快照服务,因为创建快照服务也需要在没有网络的情况下运行
- 但是如果有办法在之后直接运行发送快照服务,则计时器只能激活创建快照服务
- 我们不知道第一次创建快照服务需要多长时间。
答案1
您的主要问题似乎是如何systemd
在第一个服务成功启动后立即启动第二个服务。它没有说明万一完成pyznap.service
但pyznap-send.service
缺乏实际发送快照的网络连接要做什么,所以我假设您不打算使用复杂的重试逻辑。
在这种情况下,您可以考虑省略第二个服务,并向使用以下选项调用的ExecStartPost
服务添加一行:pyznap.service
pyznap
send
ExecStartPost=/usr/bin/pyznap send
或者,如果你想拥有更多的systemd
控制功能,你仍然可以定义,但通过一条语句pyznap-send.service
激活它:pyznap.service
ExecStartPost
ExecStartPost=/usr/sbin/systemctl start pyznap-send.service
在这种情况下,您需要删除文件After=pyznap.service
中的语句pyznap-send.service
,因为当调用启动 的行时,pyznap.service
可能尚未将其注册为“已启动” 。ExecStartPost
pyznap-send.service