在StartLimitInterval之后systemd服务自动重启


33

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

[服务]
重新启动=始终
StartLimitInterval = 90
StartLimitBurst = 3

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


3
我写了一篇文章,解释了如何创建服务以及如何避免该特定问题:使用systemd创建Linux服务
本杰明

2
我想你在找StartLimitIntervalSec,不是StartLimitInterval
Marc Tamsky '17

Answers:


30

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

Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3

对于使用“ Type = idle”运行脚本的服务,这为我工作。请注意,“ StartLimitInterval”必须大于“ RestartSec * StartLimitBurst”,否则服务将无限期重启。

我花了一些时间反复试验才能弄清systemd如何使用这些选项,这表明systemd的文档记录不如人们希望的那样。这些选项有效地提供了我想要的重试周期时间和最大重试次数。


这应该标记为已接受的答案...
Jeff

StartLimitInterval=在我最新的ubuntu 18中找不到指令...
威克

10

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

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

我仍在尝试自己找出实现所需行为的方法。


正如您所指出的,这不仅仅是评论,而是答案。
戴夫M,

正是我需要的,ty
一些Linux Nerd

根据您链接的文档,它不是StartLimitIntervalSec=(和DefaultStartLimitIntervalSec=)吗?请注意Sec,两个参数名称均已添加。
Doktor J

6

几年后,使用systemd 232时,它不再起作用,如问题和2016年的答案中所述。选项名称StartLimitIntervalSec和部分已更改。现在,它必须类似于以下示例:

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

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

这将在30秒(5 * 6)内进行5次重启,再在33秒内进行1次重启。因此,我们在33秒内有6次重启。这超过了在33秒内重新启动5次的限制。因此,重新启动将在大约31秒后停止5次计数。


1
StartLimitInterval在本Service节中,如果没有说明,则似乎仍受支持。但是,首选的新功能StartLimitIntervalSec仅适用于Unit
Danek Duvall

1

您可以设置OnFailure为在失败时启动另一个服务。在失败服务中,您可以运行一个脚本,该脚本等待,然后重新启动服务。

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


1

您可以使用StartLimitAction=reboot。这将在StartLimitInterval之后重新启动系统。

StartLimitAction =配置在达到使用StartLimitInterval =和StartLimitBurst =配置的速率限制时采取的措施。采取以下任何一种措施:重新引导,强制重新引导或立即重新引导。如果未设置,则达到速率限制将不会触发任何操作,除了不允许启动。reboot会按照正常的关闭过程进行重新引导(即等同于systemctl重新引导)。reboot-force会导致强制重启,该重启将强制终止所有进程,但在重启时不会导致脏文件系统(即,等效于systemctl reboot -f),而remediate-immediate会导致立即执行reboot(2)系统调用,这可能会导致数据丢失。默认为无。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.