如果“oneshot”服务第一次失败,如何确保重试?

JKn*_*ght 20 systemd

我已经阅读了几次 systemd 服务手册,但我仍然无法找出基本的 systemd 模式:

我想在启动时运行一次启动过程(如 docker 容器或格式化驱动器),成功完成。但是,如果我为此使用 Type=oneshot,则不能使用 Restart=on-failure,如果失败,则不会重试作业。我在这里遗漏了一些明显的东西吗?

我还尝试使用 Restart=on-failure 设置 Type=simple,但是在很多情况下,我需要 oneshot 服务提供的以下行为(来自联机帮助页):

oneshot 的行为类似于 simple;但是,预计该进程必须在 systemd 启动后续单元之前退出。

更新:

JKn*_*ght 5

我正在尝试的一种可能的解决方法是

  [Unit]
    Description=Tags instance and EBS vols
    After=docker.service
    Requires=docker.service

    [Service]
    ExecStartPre=/usr/bin/docker run --rm -v /opt/tag.sh:/tag.sh -v /opt:/ack --entrypoint=/bin/sh alpine /tag.sh
    ExecStartPre=/usr/bin/sh -c '[[ -e /opt/TAG_SUCCESS ]]'
    ExecStart=/usr/bin/rm /opt/TAG_SUCCESS
    Restart=on-failure
    RestartSec=30
Run Code Online (Sandbox Code Playgroud)

当该脚本tag.shtouch /ack/TAG_SUCCESS在执行结束。我相信这非常接近所需的行为,因为ExecStartPre将顺序执行,在调用之前等待成功完成,ExecStart并且该单元只被认为是Starting一次ExecStart调用,我们确定我们已经完成了启动任务。

但这仍然感觉像一个巨大的黑客?