我已经阅读了几次 systemd 服务手册,但我仍然无法找出基本的 systemd 模式:
我想在启动时运行一次启动过程(如 docker 容器或格式化驱动器),成功完成。但是,如果我为此使用 Type=oneshot,则不能使用 Restart=on-failure,如果失败,则不会重试作业。我在这里遗漏了一些明显的东西吗?
我还尝试使用 Restart=on-failure 设置 Type=simple,但是在很多情况下,我需要 oneshot 服务提供的以下行为(来自联机帮助页):
oneshot 的行为类似于 simple;但是,预计该进程必须在 systemd 启动后续单元之前退出。
更新:
我正在尝试的一种可能的解决方法是
[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.sh
会touch /ack/TAG_SUCCESS
在执行结束。我相信这非常接近所需的行为,因为ExecStartPre
将顺序执行,在调用之前等待成功完成,ExecStart
并且该单元只被认为是Starting
一次ExecStart
调用,我们确定我们已经完成了启动任务。
但这仍然感觉像一个巨大的黑客?
归档时间: |
|
查看次数: |
10962 次 |
最近记录: |