Catatan: Saya menulis artikel di Medium yang menjelaskan cara membuat layanan, dan cara menghindari masalah khusus ini: Membuat layanan Linux dengan systemd .
Pertanyaan asli:
Saya menggunakan systemd untuk membuat skrip pekerja berfungsi setiap saat:
[Unit]
Description=My worker
After=mysqld.service
[Service]
Type=simple
Restart=always
ExecStart=/path/to/script
[Install]
WantedBy=multi-user.target
Meskipun restart berfungsi dengan baik jika skrip keluar secara normal setelah beberapa menit, saya perhatikan bahwa jika itu berulang kali gagal dieksekusi pada startup, systemd
hanya akan menyerah mencoba untuk memulainya:
Jun 14 11:10:31 localhost systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:10:31 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:10:31 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:10:31 localhost systemd[1]: Failed to start My worker.
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'start-limit'.
Demikian pula, jika skrip pekerja saya gagal beberapa kali dengan status keluar dari 255
, systemd
menyerah mencoba untuk me-restart itu:
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:25:51 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:25:51 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:25:51 localhost systemd[1]: Failed to start My worker.
Jun 14 11:25:51 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'start-limit'.
Apakah ada cara untuk memaksa systemd
untuk selalu mencoba lagi setelah beberapa detik?
StartLimitIntervalSec=0
dan voila.Ya ada. Anda dapat menentukan untuk mencoba lagi setelah
x
detik di bawah[Service]
bagian,Setelah menyimpan file, Anda perlu memuat ulang konfigurasi daemon untuk memastikan
systemd
mengetahui file baru,kemudian restart layanan untuk mengaktifkan perubahan,
Seperti yang Anda minta, Melihat dokumentasi,
Kedengarannya seperti rekomendasi yang layak.
sumber
RestartSec
arahan,systemd
upaya severals memulai kembali dengan sangat cepat, lalu memasuki kondisi kegagalan permanen; sesuatu yang tidak bisa terjadi ketikaRestartSec
ditentukan?always
adalah superset darion-failure
, jadi itu tidak akan membantu!Tidak. Systemd menyerah untuk mencoba menghidupkannya kembali sebentar . Ini jelas ditunjukkan dalam log yang Anda berikan:
Ini adalah pembatasan laju tendangan masuk.
Panjang sebentar ditentukan dalam unit layanan, menggunakan
StartLimitIntervalSec=
pengaturan. Jumlah awal yang diperlukan dalam interval itu untuk memicu mekanisme pembatasan laju ditentukan melaluiStartLimitBurst=
pengaturan. Jika tidak ada yang berbeda pada sistem Anda dari vanilla systemd, termasuk pengaturan default untuk kedua pengaturan ini, maka itu adalah 5 kali dalam 10 detik.StartLimitIntervalSec=0
menonaktifkan pembatasan tingkat, jadi systemd akan mencoba lagi selamanya daripada menyerah. Tetapi membuat layanan Anda tidak sering keluar, atau cukup menganggur antara keluar dan memulai ulang sehingga tidak melebihi ambang batas tingkat tarif, adalah pendekatan yang lebih baik.Perhatikan bahwa pembatasan tarif tidak peduli bagaimana layanan Anda keluar. Ini memicu pada sejumlah upaya untuk memulai / memulai ulang, terlepas dari penyebabnya.
Bacaan lebih lanjut
systemd.unit
. halaman manual systemd. freedesktop.org.sumber
StartLimitIntervalSec=10
danStartLimitIntervalSec=5
, tidak berhasil.StartLimitIntervalSec=0
.