blog-header-systemd-service-fail-restart-howto-2017

Linux mini-howto: Systemd automatický restart služby při selhání.

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Systemd a restart služby při selhání


Systemd je “nový” init systém pro správu služeb navržený exkluzivně pro Linux s cílem nahradit původní SysV init scripty pocházející z System V unix větve a i přes jistou kontroverzi se stává (stal) novým standardem ve světě Linuxu, najdeme ho v drtivě většině mainstream distribucí a je potřeba naučit se s ním žít.

Jednou z operací, která se často řeší je automatický restart služby po jejím zhavarování, jsou služby, které požadujeme aby běželi na serveru neustále, tedy v případě jejich výpadku chceme zkusit automaticky restart, někdo si na to píše vlastní scripty nebo nasazuje nástroj Monit, daemontools či další, Systemd tuto funkci intergruje do sebe, proč ji nevyužit, pojďme na to, je to velmi jednoduché.

Systemd organizuje služby (lépe řečeno libovolné zdroje, které systém umí obsluhovat) do tzv. jednotek (unit), standardně je společně s distribucí v systému předinstalováno mnoho výchozích definic jednotek(služeb chcete-li) a typicky je najdete v /lib/systemd/system, tyto soubory není doporučeno měnit.

Mnohem lepší a doporučené řešení je rozšířit (extend) nebo také přepsat(override) původní definici jednotky, vše se odehrává v /etc/systemd/system adresáři, ukažme si to na triviálním příkladu se službou fail2ban, ale obecně lze aplikovat na cokoliv.

# mkdir -p /etc/systemd/system/fail2ban.service.d
# cd /etc/systemd/system/fail2ban.service.d/
# vim fail2ban-restart-on-failure.conf

Založíme adresář, jméno musí být ve tvaru <unit>.service.d (.d = drop-in) a zde libovolný soubor .conf příponou, který obsahuje rozšíření původní konfigurace <unit>, pozor pokud uděláte soubor override.conf tak bude naopak konfigurace přepsána.

fail2ban-restart-on-failure.conf

[Service]
Restart=always
RestartSec=30

Reload konfigurace Systemd a hotovo.

# systemctl daemon-reload

Malý test se zabitím procesu fail2ban a pohled do logu.

systemd[1]: fail2ban.service: Control process exited, code=exited status=255
systemd[1]: fail2ban.service: Unit entered failed state.
systemd[1]: fail2ban.service: Failed with result 'exit-code'.
...
systemd[1]: fail2ban.service: Service hold-off time over, scheduling restart
systemd[1]: Stopped Fail2Ban Service.
systemd[1]: Starting Fail2Ban Service...
systemd[1]: Started Fail2Ban Service.

To bylo snadné, že. ;-).

Všimněte si, z logu exitcode a teď se podívejme jak to dělá Systemd např. s SSH službou ve výchozí podobě a nechte se inspirovat co s tím lze ještě vyčarovat.

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify

Děkujeme za pozornost. MOJEservery.cz

ZDROJE:

https://www.freedesktop.org/wiki/Software/systemd/

https://www.freedesktop.org/software/systemd/man/systemd.unit.html

Redhat –  CREATING AND MODIFYING SYSTEMD UNIT FILES.