Systemd的StartLimitIntervalSec和StartLimitBurst永远无法工作


12

我试图限制服务(在容器中)重新启动的次数。操作系统版本为centos-release-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

2
如答案所示,这比忘记输入“ Sec”的用户更重要。我认为结束这样一个问题无济于事,因为我们要提供这么多详细信息。
sourcejedi

Answers:


21

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

要在CentOS上检查系统版本,请运行rpm -q systemd

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

资料来源:https : //lists.freedesktop.org/archives/systemd-devel/2017-July/039255.html

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

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

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

那很有意思。您建议StartLimitBurst在[Service]部分中放置,但是文档指出它应该在[Unit]部分中。freedesktop.org/software/systemd/man/systemd.unit.html StartLimitIntervalSec=interval, StartLimitBurst=burst Configure unit start rate limiting. Units which are started more than burst times within an interval time interval are not permitted to start any more.
Ikrom,

1
@Ikrom 在systemd v229及以下版本中
sourcejedi

@sourcejedi谢谢!刚刚在我的centos 7上检查了systemd /usr/lib/systemd/systemd --version,它是v219。我需要注意systemd版本。
Ikrom '18 -10-17

如果可以的话,+ 10。我之前已经寻找过这种解决方案好几次了(显然不擅长使用Google搜索)。对我来说也是新的systemd-analyze。谢谢!
JCotton

似乎systemd-analyze仅适用于已安装的服务文件,而不适用于(例如)您尝试编写但尚未安装的本地文件。(至少,在我尝试使用它时,v219似乎就是这种情况。)如果是这样,那么在此答案中可能值得一提。
mhucka

5

我想我找到了问题。所有在线文档都建议所有这些参数都在UNIT文件(systemd单位文件)中,但仍在我的系统中(centos 7.5),它们在服务文件中。除了名称是“ StartLimitInterval”,而不是“ StartLimitIntervalSec”。

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.