Как автоматично да рестартирате услугите на Linux със Systemd

Надеждната работа на вашите Linux приложения е от първостепенно значение за производителноста на вашия сървър. Един от начините да се осигури винаги достъпна услуга, е да се гарантира, че тя се рестартира автоматично в случай на срив. Systemd предоставя необходимите инструменти, за да се случи това.

Полезна функция, която често е необходима за дълго работещи демони като WEB, DNS, MAIL и други услуги, е възможността за автоматично рестартиране на процеса в случай на срив, за да се сведе до минимум времето в което услугата не работи. Ако вашата услуга се управлява от Systemd, можете да използвате опциите Restart и RestartSec, за да конфигурирате това поведение за конкретна услуга. В този случай ще промения конфигурацията в DNS сървъра Bind9 като редактирам файла sudo vim /etc/systemd/system/bind9.service и добавя в секцията [Service] два реда:

Restart=on-failure
RestartSec=60s

Файлът /etc/systemd/system/bind9.service изглежда така:

[Unit]
Description=BIND Domain Name Server
Documentation=man:named(8)
After=network.target
Wants=nss-lookup.target
Before=nss-lookup.target

[Service]
EnvironmentFile=-/etc/default/named
ExecStart=/usr/sbin/named -f $OPTIONS
ExecReload=/usr/sbin/rndc reload
ExecStop=/usr/sbin/rndc stop
Restart=on-failure
RestartSec=60s

[Install]
WantedBy=multi-user.target
Alias=bind9.service

Restart=on-failure е настроен при срив така, че услугата да се рестартира, ако излезе с различен изход от active което е работещото състояние. Опцията RestartSec=60s конфигурира времето за изчакване преди рестартиране на услугата. Тук е зададенo 60 секунди.

След като актуализирах мов Systemd конфигурационен файл на DNS сървъра Bind9, изпълнявам командата по-долу, за да съм сигурен, че мойте промени ще влязат в сила:

sudo systemctl daemon-reload

Две други полезни опции, които трябва да знаете, са StartLimitIntervalSec и StartLimitBurst. И двете са полезни за конфигуриране кога Systemd трябва да спре да се опитва да рестартира услуга. Тяхното място обаче е в секцията [Unit]. Първият определя интервал от време в секунди, докато вторият определя максималния брой времена, които са разрешени за рестартиране на услугата в рамките на определения интервал. нека дам пример:

StartLimitIntervalSec=600
StartLimitBurst=3

Файлът /etc/systemd/system/bind9.service изглежда така:

[Unit]
Description=BIND Domain Name Server
Documentation=man:named(8)
After=network.target
Wants=nss-lookup.target
Before=nss-lookup.target
StartLimitIntervalSec=600
StartLimitBurst=3

[Service]
EnvironmentFile=-/etc/default/named
ExecStart=/usr/sbin/named -f $OPTIONS
ExecReload=/usr/sbin/rndc reload
ExecStop=/usr/sbin/rndc stop
Restart=on-failure
RestartSec=60s

[Install]
WantedBy=multi-user.target
Alias=bind9.service

Съгласно конфигурацията по-горе, услугата няма право да се рестартира повече от три пъти в рамките на интервал от 600 секунди. Ако услугата се срине повече от три пъти, няма да й бъде разрешено да стартира повече. След презареждане на конфигурацията на мениджъра на systemd (sudo systemctl daemon-reload), убийте работещата услуга и потвърдете, че тя се рестартира автоматично след изтичане на времето, посочено от RestartSec.

sudo killall -9 named

След като сме убили демона, можем да проверим тече ли времето вече за автоматичния рестарт.

systemctl status bind9.service --no-page

Минали са 21 секунди, което ще рече, че след 39 секунди systemd ще рестартира демона.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.