StartLimitIntervalSec dan StartLimitBurst dari Systemd tidak pernah berfungsi

12

Saya mencoba membatasi jumlah layanan (dalam wadah) restart. Versi OS adalah centos-release-7-5, file layanannya cukup banyak seperti di bawah ini (menghapus beberapa parameter untuk kenyamanan membaca). Itu harus cukup lurus ke depan karena beberapa posting lain menunjukkan (Post of Server Fault batas restart 1, Post of Stack Overflow restart batas 2). Namun StartLimitBurst dan StartLimitIntervalSec tidak pernah bekerja untuk saya.

Saya diuji dengan beberapa cara: (1) Saya memeriksa PID layanan, membunuh layanan dengan "kill -9 ****" beberapa kali. Layanan selalu dimulai ulang setelah 20-an! (2) Saya juga mencoba mengacaukan file layanan, membuat wadah tidak pernah berjalan. Namun, itu tidak berhasil, file layanan terus restart.

Ada ide?

[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
batilei
sumber
2
Ini lebih penting daripada seseorang yang lupa mengetik "Sec", seperti yang ditunjukkan oleh jawaban. Saya kira tidak ada gunanya menutup pertanyaan seperti itu, yang ditanyakan dengan begitu banyak detail yang kita inginkan.
sourcejedi

Jawaban:

21

StartLimitIntervalSec=telah ditambahkan sebagai bagian dari systemd v230. Di systemd v229 dan di bawah, Anda hanya dapat menggunakan StartLimitInterval=. Anda juga perlu meletakkan StartLimitInterval=dan StartLimitBurst=di [Service]bagian - bukan [Unit]bagian.

Untuk memeriksa versi systemd Anda di CentOS, jalankan rpm -q systemd.

Jika Anda pernah memutakhirkan ke systemd v230 atau lebih tinggi, nama-nama lama di [Service]bagian akan terus berfungsi.

Sumber: https://lists.freedesktop.org/archives/systemd-devel/2017-July/039255.html

Anda dapat memiliki masalah ini tanpa melihat kesalahan sama sekali, karena systemd mengabaikan arahan yang tidak diketahui. systemd mengasumsikan bahwa banyak arahan baru dapat diabaikan dan masih memungkinkan layanan untuk berjalan.

Dimungkinkan untuk secara manual memeriksa file unit untuk arahan yang tidak diketahui. Setidaknya itu berfungsi pada systemd terbaru:

$ systemd-analyze verify foo.service
/etc/systemd/system/foo.service:9: Unknown lvalue 'FancyNewOption' in section 'Service'
sourcejedi
sumber
Itu menarik. Anda menyarankan untuk memasukkan StartLimitBurstbagian [Layanan], tetapi dokumentasi mengatakan itu harus di bagian [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 Dalam systemd v229 dan di bawah ini
sourcejedi
@sourcejedi Terima kasih! Baru saja memeriksa systemd pada centos 7 saya /usr/lib/systemd/systemd --versiondan itu v219. Saya perlu menjaga versi systemd.
Ikrom
+10 jika aku bisa. Saya telah mencari solusi ini beberapa kali sebelumnya (dan ternyata buruk dalam googling). Juga baru bagi saya systemd-analyze. Terima kasih!
JCotton
Tampaknya systemd-analyzehanya berfungsi untuk file layanan yang sudah diinstal, bukan pada (katakanlah) file lokal yang Anda coba tulis tetapi belum diinstal. (Setidaknya, itulah yang tampaknya menjadi kasus pada v219 dalam upaya saya untuk menggunakannya.) Jika itu benar, mungkin ada baiknya menyebutkannya dalam jawaban ini.
mhucka
5

Saya rasa saya menemukan masalahnya. Semua dokumen online menyarankan semua parameter dalam file UNIT (file unit systemd ), tetapi masih dalam sistem saya (centos 7.5), mereka berada dalam file layanan. Selain itu namanya "StartLimitInterval", bukan "StartLimitIntervalSec".

batilei
sumber