Menulis Unit systemd yang Benar: Restart Otomatis dan Batasannya
Restart=always terdengar seperti solusi, tetapi tanpa batas ia berubah menjadi percobaan tanpa henti yang menutupi penyebab gagalnya.
Unit contoh
[Unit]
Description=Netvora API
After=network-online.target mysql.service
Wants=network-online.target
[Service]
Type=simple
User=netvora
WorkingDirectory=/opt/netvora-api
ExecStart=/opt/netvora-api/bin/api --config /etc/netvora/api.yaml
Restart=on-failure
RestartSec=3
StartLimitIntervalSec=120
StartLimitBurst=5
# Batasi dampak kalau layanan bermasalah
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Arti tiap setelan
| Setelan | Arti sebenarnya |
|---|---|
Restart=on-failure | Dijalankan ulang hanya kalau keluar dengan kode galat atau terbunuh sinyal |
Restart=always | Dijalankan ulang juga saat berhenti normal, dan ini sering tidak diinginkan |
RestartSec=3 | Jeda sebelum percobaan berikutnya, memberi waktu dependensi siap |
StartLimitIntervalSec + StartLimitBurst | Batas percobaan dalam satu rentang waktu |
After= | Urutan mulai, bukan jaminan dependensi sudah siap menerima koneksi |
Baris terakhir itu yang paling menyesatkan. After=mysql.service hanya berarti layanan dimulai setelah MySQL dimulai, bukan setelah MySQL siap melayani. Kalau aplikasi langsung gagal koneksi saat dinyalakan, yang dibutuhkan adalah percobaan ulang di sisi aplikasi, bukan menambah After=.
Perilaku setelah batas percobaan tercapai
Kalau lima percobaan dalam 120 detik juga gagal, systemd berhenti mencoba dan menandai unit sebagai failed. Ini perilaku yang diinginkan: layanan yang gagal berulang menandakan masalah konfigurasi atau data, dan mencoba terus hanya menyembunyikannya.
systemctl status netvora-api
journalctl -u netvora-api -n 50 --no-pager
systemctl reset-failed netvora-api && systemctl start netvora-api
reset-failed menghapus penghitung percobaan setelah penyebabnya diperbaiki. Tanpa itu, unit akan menolak start sampai penghitungnya direset manual.
Cara memeriksa konfigurasi tanpa menyalakan layanan
systemd-analyze verify /etc/systemd/system/netvora-api.service
systemctl cat netvora-api
systemd-analyze verify menangkap salah tulis nama setelan sebelum layanan dijalankan. Ini menghemat satu siklus gagal-jalan yang biasanya memakan waktu paling banyak.