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
systemctl auto restart — Как автоматично да рестартирате услугите на Linux със Systemd

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

Заключение

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