Systemd 的 StartLimitIntervalSec 和 StartLimitBurst 永远不起作用

Systemd 的 StartLimitIntervalSec 和 StartLimitBurst 永远不起作用

我试图限制服务(在容器中)重新启动的次数。操作系统版本为CentOs 7.5,服务文件大致如下(为了阅读方便,删除了一些参数)。正如其他一些帖子指出的那样,它应该非常简单(服务器故障重启限制 1 的帖子,堆栈溢出重启限制 2 的帖子)。但StartLimitBurst从来StartLimitIntervalSec没有为我工作过。

我测试了几种方法:

  1. 我检查了服务PID,kill -9 ****多次杀死该服务。该服务总是在之后重新启动20多岁
  2. 我还尝试弄乱服务文件,使容器永远不会运行。尽管如此,它还是不起作用,服务文件只是不断重新启动。

任何想法?

[Unit]
Description=Hello Fluentd
After=docker.service
Requires=docker.service
StartLimitBurst=2
StartLimitIntervalSec=150s

[Service]
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker stop "fluentd"
ExecStartPre=-/usr/bin/docker rm -f "fluentd"
ExecStart=/usr/bin/docker run fluentd
ExecStop=/usr/bin/docker stop "fluentd"
Restart=always
RestartSec=20s
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

答案1

StartLimitIntervalSec=作为 systemd v230 的一部分添加。在 systemd v229 及更低版本中,您只能使用StartLimitInterval=.您还需要将StartLimitInterval=StartLimitBurst=放入该[Service]部分 - 而不是该[Unit]部分。

要检查 CentOS 上的 systemd 版本,请运行rpm -q systemd.

如果您升级到 systemd v230 或更高版本,该部分中的旧名称[Service]将继续有效。

参考:

您可能会遇到此问题而根本看不到任何错误,因为 systemd 会忽略未知指令。 systemd 假设许多较新的指令可以被忽略并且仍然允许服务运行。

可以手动检查单元文件中是否存在未知指令。至少它似乎可以在最近的 systemd 上运行:

$ systemd-analyze verify foo.service
/etc/systemd/system/foo.service:9: Unknown lvalue 'FancyNewOption' in section 'Service'

答案2

我想我发现了问题。所有在线文档都建议所有参数都在 UNIT 文件中(系统单元文件),但仍然在我的系统(centos 7.5)中,它们位于服务文件中。此外,名称是“StartLimitInterval”,而不是“StartLimitIntervalSec”。

相关内容