Systemd 服务在 StartLimitInterval 之后自动重启

Systemd 服务在 StartLimitInterval 之后自动重启

我希望我的 systemd 服务在发生故障时自动重启。另外,我想限制重启次数。我希望在 90 秒内最多允许 3 次重启。因此我进行了以下配置。

[Service]  
Restart=always  
StartLimitInterval=90  
StartLimitBurst=3

现在服务在失败时重新启动。在 3 次快速失败/重新启动后,它不再按预期重新启动。现在我期望 systemd 在超时 ( StartLimitInterval) 后启动服务。但是 systemd 不会在超时 (90 秒) 后自动启动服务,如果我在超时后手动重新启动服务,它就可以正常工作。但我希望 systemd 在之后自动启动服务StartLimitInterval。请告诉我如何实现此功能。

答案1

要让服务以 90 秒的间隔重新启动 3 次,请在 systemd 服务文件中包含以下行:

[Unit]
StartLimitIntervalSec=400
StartLimitBurst=3
[Service]
Restart=always
RestartSec=90

systemd-230它被调用之前StartLimitInterval

[Unit]
StartLimitInterval=400
StartLimitBurst=3
[Service]
Restart=always
RestartSec=90

对于使用 运行脚本的服务,此方法对我有用Type=idle。请注意,StartLimitIntervalSec必须大于,RestartSec * StartLimitBurst否则服务将无限期重新启动。

我花了很多时间,反复试验才弄清楚 systemd 如何使用这些选项,这表明 systemd 的文档并不像人们希望的那样完善。这些选项有效地提供了我所寻找的重试周期时间和最大重试次数。

参考:https://manpages.debian.org/testing/systemd/systemd.unit.5.en.html单位部分 https://manpages.debian.org/testing/systemd/systemd.exec.5.en.html服务部分

答案2

几年后systemd 232它不再起作用,如问题和 2016 年的答案中所述。选项名称StartLimitIntervalSec和部分已更改。现在它必须看起来像这个例子:

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

这将在 30 秒内重启 5 次(5*6),并在 33 秒内重启一次。因此,我们在 33 秒内重启了 6 次。这超过了 33 秒内重启 5 次的限制。因此,大约 31 秒后,重启将在 5 次计数后停止。

答案3

您描述的行为与文档一致:

StartLimitInterval=,StartLimitBurst= 配置服务启动速率限制。默认情况下,在 10 秒内启动超过 5 次的服务不允许再启动,直到 10 秒间隔结束。使用这两个选项,可以修改此速率限制。使用 StartLimitInterval= 配置检查间隔(默认为管理器配置文件中的 DefaultStartLimitInterval=,设置为 0 以禁用任何类型的速率限制)。使用 StartLimitBurst= 配置允许每个间隔启动多少次(默认为管理器配置文件中的 DefaultStartLimitBurst=)。这些配置选项与 Restart= 结合使用特别有用;但是,它们适用于所有类型的启动(包括手动启动),而不仅仅是由 Restart= 逻辑触发的启动。请注意,配置为 Restart= 并且达到启动限制的单元将不再尝试重新启动;但是,它们仍可在稍后手动重新启动,从那时起,重启逻辑将再次激活。请注意,systemctl reset-failed 将导致服务的重启率计数器被刷新,这在管理员想要手动启动服务并且启动限制干扰这一点时很有用。

我仍在努力寻找一种方法来实现您所期望的行为。

答案4

您可以设置OnFailure当此操作失败时启动另一个服务。在故障服务您可以运行一个脚本来等待然后重新启动您的服务。

有关如何设置的示例,请参阅单元故障时 Systemd 状态邮件并将其修改为重新启动服务。

相关内容