web-dev-qa-db-ja.com

SystemdのStartLimitIntervalSecおよびStartLimitBurstが機能しない

(コンテナー内の)サービスの再起動数を制限しようとしました。 OSのバージョンはcentos-release-7-5で、サービスファイルは次のようになります(読みやすいようにいくつかのパラメーターを削除しました)。他のいくつかの投稿が指摘したように、それはかなり単純なはずです(Post of Server Faultの再起動制限1、Post of Stack Overflowの再起動制限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
11
batilei

StartLimitIntervalSec=はsystemd v230の一部として追加されました。 systemd v229以前では、StartLimitInterval=のみを使用できます。また、StartLimitInterval=セクションではなくStartLimitBurst=セクションに[Service]および[Unit]を配置する必要があります。

CentOSでsystemdのバージョンを確認するには、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'
18
sourcejedi

私は問題を見つけたと思います。オンラインのすべてのドキュメントは、これらのすべてのパラメーターがUNITファイル( systemd unit file )にあることを示唆していますが、まだ私のシステム(centos 7.5)にあり、それらはサービスファイルにあります。名前は「StartLimitIntervalSec」ではなく「StartLimitInterval」です。

5
batilei