从一个 systemd 计时器激活两个“oneshot”服务,以便它们相继启动

从一个 systemd 计时器激活两个“oneshot”服务,以便它们相继启动

我有两个服务快照:

  • 一个创建快照的
  • 发送快照的

第二个(发送)应该总是在之后执行第一个(创建)已完成。目前,类型为 的服务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.servicepyznap-send.service缺乏实际发送快照的网络连接要做什么,所以我假设您不打算使用复杂的重试逻辑。

在这种情况下,您可以考虑省略第二个服务,并向使用以下选项调用的ExecStartPost服务添加一行:pyznap.servicepyznapsend

ExecStartPost=/usr/bin/pyznap send

或者,如果你想拥有更多的systemd控制功能,你仍然可以定义,但通过一条语句pyznap-send.service激活它:pyznap.serviceExecStartPost

ExecStartPost=/usr/sbin/systemctl start pyznap-send.service

在这种情况下,您需要删除文件After=pyznap.service中的语句pyznap-send.service,因为当调用启动 的行时,pyznap.service可能尚未将其注册为“已启动” 。ExecStartPostpyznap-send.service

相关内容