0887 371 498 support@itservice-bg.net
28.11.2022 · Самуил Арсов · Debian, Hosting, Kali Linux, Linux commands, Ubuntu

Как автоматично да рестартирате услугите на 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 — услугата се рестартира автоматично, ако процесът завърши с ненулев изход (грешка) или бъде прекратен от сигнал. При нормално спиране чрез systemctl stop услугата не се рестартира. Опцията RestartSec=60s конфигурира времето за изчакване преди рестартиране на услугата. Тук са зададени 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 ще рестартира демона.

Заключение

Автоматичното рестартиране на услуги чрез Systemd е прост, но ефективен начин за увеличаване на надеждността на вашия сървър. Комбинацията от Restart=on-failure, RestartSec, StartLimitIntervalSec и StartLimitBurst дава пълен контрол — услугата се рестартира при срив, но не безкрайно, ако проблемът е системен. Прилагайте тази конфигурация за всички критични демони: уеб сървъри, DNS, пощенски сървъри и всякакви дълго работещи процеси.