如果 ExecStartPre 失败,systemd ExecStopPost 将不会运行?

如果 ExecStartPre 失败,systemd ExecStopPost 将不会运行?

systemd我已经看过这里的文档了https://www.freedesktop.org/software/systemd/man/systemd.service.html

ExecStartPre=,ExecStartPost=它在部分中指出

请注意,如果 ExecStartPre=、ExecStart= 或 ExecStartPost= 中指定的任何命令失败(并且没有以“-”为前缀,参见上文)或在服务完全启动之前超时,则继续执行 ExecStopPost= 中指定的命令,并跳过 ExecStop= 中的命令

我有一条ExecStartPre规则

ExecStartPre=/bin/false

ExecStopPost我 有 一个/bin/echo "I'm at ExecStopPost"

该服务看起来像

[Unit]
Description=Test

[Service]
Type=oneshot
ExecStartPre=/bin/echo "I'm at ExecStartPre"
ExecStartPre=/bin/false
ExecStart=/bin/echo "Running Test"
ExecStopPost=/bin/echo "I'm at ExecStopPost"

当它运行失败时,我从未看到过它。系统日志的输出如下

6月15日 20:48:01 ip-10-0-0-246 echo[8687]: 我位于 ExecStartPre

6月15日 20:48:01 ip-10-0-0-246 systemd[1]: test.service: 控制进程已退出,代码=退出状态=1

6月15日 20:48:01 ip-10-0-0-246 systemd[1]: 无法启动测试。

6 月 15 日 20:48:01 ip-10-0-0-246 systemd[1]: test.service.service: 单元进入故障状态。

6 月 15 日 20:48:01 ip-10-0-0-246 systemd[1]: test.service.service: 失败,结果为“退出代码”。

我从来没有看到过我的回声。

journalctl -u test.service当然也有这个作为它的入口。

我是否需要稍微不同地配置它?或者我需要使用OnFailure

我需要能够Conflicts=在成功或失败的情况下重新启动。这将用于计时器触发的一次性服务。

哦,这是在 16.04.6 LTS 上运行的。

答案1

服务似乎oneshot不会ExecStopPost在失败时调用。此链接对此进行了讨论https://bugzilla.redhat.com/show_bug.cgi?id=1353039

相关帖子

仅当单元从运行状态转换(即使单元被杀死)或主 PID 在激活状态下成功退出且服务不是分叉类型时,才会执行 ExecStopPost。

区别在于,如果是一次性服务,在执行配置的 ExecStart 操作时,服务仍处于激活状态且未运行。但是,如果是简单服务,systemd 会立即将服务转换为运行状态,即使 ExecStart 失败(即 ExecStart=/bin/false),systemctl 也不会阻塞并返回 exit 0。因此,一次性服务必须完全退出才能调用 ExecStopPost。据我所知,选项 RemainAfterExit 对 ExecStopPost 没有影响。

最终的解决方案是添加一个OnFailure来调用必要的项目,这些项目本来应该在ExecStopPost

相关内容