layanan systemd restart otomatis setelah StartLimitInterval

33

Saya ingin layanan systemd saya secara otomatis restart pada kegagalan. Selain itu saya ingin menilai membatasi restart. Saya ingin mengizinkan maksimum 3 restart dalam durasi 90 detik. Karenanya saya telah melakukan konfigurasi berikut.

[Layanan]
Mulai ulang = selalu
StartLimitInterval = 90
StartLimitBurst = 3

Sekarang layanan dimulai ulang pada kegagalan. Setelah 3 kegagalan cepat / restart itu tidak memulai lagi seperti yang diharapkan. Sekarang saya mengharapkan systemd untuk memulai layanan setelah batas waktu (StartLimitInterval). Tetapi systemd tidak secara otomatis memulai layanan setelah batas waktu (90sec), jika saya secara manual me-restart layanan setelah batas waktu itu berfungsi. Tapi saya ingin systemd untuk secara otomatis memulai layanan setelah StartLimitInterval. Tolong beri tahu saya cara mencapai fitur ini.

Dinesh PR
sumber
3
Saya menulis artikel yang menjelaskan cara membuat layanan, dan bagaimana menghindari masalah khusus ini: Membuat layanan Linux dengan systemd .
Benjamin
2
Saya pikir Anda sedang mencari StartLimitIntervalSec, bukan StartLimitInterval.
Marc Tamsky

Jawaban:

30

Untuk memiliki layanan restart 3 kali pada interval 90 detik termasuk baris berikut dalam file layanan systemd Anda:

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

Ini berfungsi untuk saya untuk layanan yang menjalankan skrip menggunakan 'Type = idle'. Perhatikan bahwa 'StartLimitInterval' harus lebih besar dari 'RestartSec * StartLimitBurst' jika tidak, layanan akan dimulai ulang tanpa batas waktu.

Butuh beberapa waktu dengan banyak coba-coba untuk mengetahui bagaimana systemd menggunakan opsi ini, yang menunjukkan bahwa systemd tidak didokumentasikan dengan baik seperti yang diharapkan. Opsi-opsi ini secara efektif menyediakan waktu siklus coba ulang dan coba ulang maksimum yang saya cari.

jross
sumber
Ini harus ditandai sebagai jawaban yang diterima ...
Jeff
tidak dapat menemukan StartLimitInterval=arahan di ubuntu terbaru saya 18 ...
sumbu
10

Perilaku yang Anda gambarkan konsisten dengan dokumentasi:

StartLimitInterval =, StartLimitBurst = Konfigurasikan pembatasan tingkat layanan. Secara default, layanan yang dimulai lebih dari 5 kali dalam 10 detik tidak diizinkan untuk memulai lagi sampai interval 10 detik berakhir. Dengan dua opsi ini, pembatasan tingkat ini dapat dimodifikasi. Gunakan StartLimitInterval = untuk mengkonfigurasi interval pengecekan (default ke DefaultStartLimitInterval = dalam file konfigurasi manajer, atur ke 0 untuk menonaktifkan segala jenis pembatasan tingkat). Gunakan StartLimitBurst = untuk mengonfigurasi berapa banyak permulaan yang diizinkan (default ke DefaultStartLimitBurst = dalam file konfigurasi manajer). Opsi konfigurasi ini sangat berguna dalam hubungannya dengan Restart =; namun, mereka berlaku untuk semua jenis permulaan (termasuk manual), bukan hanya yang dipicu oleh logika Restart =.Perhatikan bahwa unit yang dikonfigurasikan untuk Restart = dan yang mencapai batas mulai tidak dicoba untuk dihidupkan ulang lagi; Namun, mereka mungkin masih direstart secara manual di titik kemudian, dari titik mana, logika restart diaktifkan kembali. Perhatikan bahwa systemctl reset-gagal akan menyebabkan penghitung tingkat mulai ulang untuk layanan memerah, yang berguna jika administrator ingin memulai layanan secara manual dan batas mulai mengganggu itu.

Saya masih berusaha untuk menemukan cara untuk mencapai perilaku yang Anda inginkan.

Youssef Eldakar
sumber
Ini lebih merupakan komentar daripada jawaban seperti yang Anda tunjukkan.
Dave M
persis apa yang saya butuhkan, ty
Beberapa Linux Nerd
Menurut dokumentasi yang Anda tautkan, bukankah seharusnya begitu StartLimitIntervalSec=(dan DefaultStartLimitIntervalSec=)? Perhatikan penambahan Secuntuk kedua nama parameter.
Doktor J
6

Beberapa tahun kemudian dan dengan systemd 232 itu tidak berfungsi lagi seperti yang dijelaskan dalam pertanyaan dan jawaban dari 2016. Nama opsi StartLimitIntervalSecdan Bagian telah berubah. Sekarang harus terlihat seperti contoh ini:

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

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

Ini akan melakukan 5 restart dalam 30 detik (5 * 6) ditambah satu restart dalam 33 detik. Jadi kita punya 6 restart dalam 33 detik. Ini melebihi batas 5 restart dalam 33 detik. Jadi restart akan berhenti pada 5 hitungan setelah sekitar 31 detik.

Ingo
sumber
1
Sepertinya StartLimitIntervalmasih didukung, jika tidak didokumentasikan, di Servicebagian ini. Tetapi yang baru, lebih disukai StartLimitIntervalSechanya bekerja di Unit.
Danek Duvall
1

Anda dapat mengatur OnFailureuntuk memulai layanan lain ketika ini gagal. Di layanan on-fail Anda dapat menjalankan skrip yang menunggu dan kemudian restart layanan Anda.

Untuk sampel tentang cara mengatur ini lihat Systemd status mail on failure unit dan modifikasi untuk memulai kembali layanan sebagai gantinya.

laktak
sumber
1

Anda dapat gunakan StartLimitAction=reboot . Ini akan mem-boot ulang sistem setelah StartLimitInterval.

StartLimitAction = Konfigurasikan tindakan yang akan diambil jika batas nilai dikonfigurasikan dengan StartLimitInterval = dan StartLimitBurst = dipukul. Mengambil salah satu dari tidak ada, reboot, reboot-force, atau reboot-langsung. Jika tidak ada yang ditetapkan, menekan batas kurs tidak akan memicu tindakan selain itu permulaan tidak akan diizinkan. reboot menyebabkan reboot mengikuti prosedur shutdown normal (yaitu setara dengan systemctl reboot). reboot-force menyebabkan reboot paksa yang akan menghentikan semua proses secara paksa tetapi seharusnya tidak menyebabkan sistem file kotor pada reboot (yaitu setara dengan systemctl reboot -f) dan reboot-direct menyebabkan eksekusi segera dari pemanggilan sistem reboot (2), yang mungkin mengakibatkan dalam kehilangan data. Standarnya tidak ada.

mcv
sumber