我一直在研究一个 systemd 服务来包装一个管理脚本,并试图优雅地处理它的彻底中断。
现在我已经Restart
设置always
为当出现故障时它会再次尝试,但是某些故障状态需要注意(缺少配置文件、错误的 SQL 等),所以我不希望它在无法纠正的状态下在后台持续旋转。
我发现StartLimitInterval
,StartLimitBurst
和StartLimitAction
,它会在 Y 秒内发生 X 次故障后停止尝试重新启动,但事实证明唯一可用的操作StartLimitAction
是重新启动或关闭机器,这有点小题大做。
我一直在OnFailure
关注编写了一个小型服务来发送警报电子邮件当它被触发时,但是 OnFailure 每次服务终止时都会触发,而不是在达到启动限制时触发,所以我们会收到一堆电子邮件,而不仅仅是一封。
有什么想法下一步该尝试什么吗?
答案1
失败时=
当此单元进入“失败”状态时激活的一个或多个单元的空格分隔列表。使用 Restart= 的服务单元仅在达到启动限制后才会进入失败状态。
然而第二句话似乎是一个新的限制,因为它在我的 Arch 安装中 systemd 版本 241 的手册中,但不在我的 CentOS 7 安装中 219 版本中。
你可以使用以下命令检查 systemd 版本systemctl --version
我知道这是一个老问题,但只是想与遇到同样问题的人分享。
答案2
Startlimitaction
可能就是你想要的。手册页说
... 可采用 none、reboot、reboot-force、reboot-immediate、poweroff、poweroff-force 或 poweroff-immediate 之一。如果没有设置,达到速率限制将不会触发任何操作,除了不允许启动。
看来,将 startlimit 操作设置为 none 可能会实现您想要的效果。