StartLimitInterval后systemd服务自动重启

Din*_*.R. 45 systemd

我希望我的 systemd 服务在失败时自动重新启动。此外,我想对重新启动进行速率限制。我想在 90 秒内最多允许 3 次重启。因此我做了以下配置。

[Service]  
Restart=always  
StartLimitInterval=90  
StartLimitBurst=3
Run Code Online (Sandbox Code Playgroud)

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

小智 46

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

[Unit]
StartLimitIntervalSec=400
StartLimitBurst=3
[Service]
Restart=always
RestartSec=90
Run Code Online (Sandbox Code Playgroud)

systemd-230它被称为之前StartLimitInterval

[Unit]
StartLimitInterval=400
StartLimitBurst=3
[Service]
Restart=always
RestartSec=90
Run Code Online (Sandbox Code Playgroud)

这对我使用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


小智 21

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

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6
Run Code Online (Sandbox Code Playgroud)

这将在 30 秒 (5*6) 内重新启动 5 次,并在 33 秒内重新启动一次。所以我们在 33 秒内有 6 次重启。这超出了在 33 秒内重新启动 5 次的限制。所以重新启动将在大约 31 秒后停止在 5 个计数处。

  • 看起来在“Service”部分中仍然支持“StartLimitInterval”(如果未记录)。但是新的、首选的“StartLimitIntervalSec”只适用于“Unit”。 (2认同)
  • 这个例子似乎不能正常工作。由于服务“运行”了 6 秒,然后等待 5 秒重新启动,因此整个启动->启动循环需要 11 秒。因此,33 秒内有 3 次(或边缘 4 次)启动,并且永远不会达到 StartLimitBurst 5。我刚刚尝试过,它会无限期地重新启动。 (2认同)

小智 11

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

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

我仍在努力寻找一种方法来完成你想要的行为。