Linux

Arızalı Servis systemd ile Otomatik Nasıl Yeniden Başlatılır?2 min read

Ara 13, 2020 3 min

Arızalı Servis systemd ile Otomatik Nasıl Yeniden Başlatılır?2 min read

Okunur: 3 dakika

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.

[email protected]:~# 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

[email protected]:~# 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.

[email protected]:~# 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'.

Sistem Uzmanı, Linux Hacısı, El-Kernel