Sistemde kararsız çalışan süreçler varsa bunların otomatik olarak systemd tarafından yeniden başlatılması oldukça işinize yarayabilir. Ön tanımlı olarak işletim sisteminde 10 saniye içinde art arda beş başlatma hatasında failure olarak işaretlenir.
Bunu aşağıdaki komut ile görebilirsiniz.
systemctl --failed
Örnek çıktımız ise şu şekildedir.
root@ankara:~# systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● logrotate.service loaded failed failed Rotate log files
● networking.service loaded failed failed Raise network interfaces
● ufw.service loaded failed failed Uncomplicated firewall
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
3 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
Bunu değiştirmek isterseniz cat /etc/systemd/system.conf | grep StartLimit
komutunu verin çıkan değerleri sizi rahat ettirecek şekilde düzenleyin. Bende bu değerler şu şekilde
DefaultStartLimitIntervalSec=30s
DefaultStartLimitBurst=10
Bu örneğikte ben hali hazırda sıkıntılı olan ufw’de gerekli olan düzenlemeyi yapacağım. servis için gerekli klasörü oluşturuyoruz.
sudo mkdir -p /etc/systemd/system/ufw.service.d
Oluşturduğumuz bu klasörün içerisinde sadece restart.conf
dosyası oluşturuyoruz ve
sudo touch /etc/systemd/system/ufw.service.d/restart.conf
aşağıdaki satırları oluşturduğumuz bu restart.conf dosyamızın içerisine ekliyoruz.
[Unit]
StartLimitIntervalSec=1
[Service]
Restart=always
RestartSec=20
Daha sonradan değişikliklerin systemd tarafından geçerli olabilmesi için servisleri yeniliyoruz.
sudo systemctl daemon-reload
Peki bu durumda servisin akıbeti ne olacak? belirlediğimiz bu ufw
restart politikasına göre bu hizmet sonsuza kadar yeniden başlayacak. Bu kimi zaman iyi kimi zamanda kötüdür, servis rastgele zamanlarda belirsiz sebeplerle çöküyorsa bu yöntemi kullanabilirsiniz.
Bu yapılandırmamız ile otomatik yeniden başlatılan servisin görüntüsü ise şu şekilde olacak
root@ankara:~# systemctl status ufw
● ufw.service - Uncomplicated firewall
Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Sun 2020-12-13 17:40:48 +03; 6s ago
Docs: man:ufw(8)
Process: 1786 ExecStart=/lib/ufw/ufw-init start quiet (code=exited, status=0/SUCCESS)
Main PID: 1786 (code=exited, status=0/SUCCESS)
Dec 13 17:40:48 ankara systemd[1]: Starting Uncomplicated firewall...
Dec 13 17:40:48 ankara ufw-init[1786]: Firewall already started, use 'force-reload'
Dec 13 17:40:48 ankara systemd[1]: Started Uncomplicated firewall.
Bundan sonra sistem kalıcı olarak failure olarak işaretlemeyeceği içinde ilk başta verdiğimiz parametrenin sonucunda gözükmeyecektir.
root@ankara:~# systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● logrotate.service loaded failed failed Rotate log files
● networking.service loaded failed failed Raise network interfaces
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
2 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.