Як автоматично перезапустити службу при збої в Linux


23

У Windows ви можете встановити, що має статися, якщо / коли сервіс не працює. Чи є стандартний спосіб досягти того самого в Linux (зокрема CentOS)?

Більша частина мого питання полягає в тому, як ви обробляєте розетки, які залишилися відкритими - наприклад, у штатах TIME_WAIT, FIN_WAIT1 тощо.

На даний момент, якщо сервіс, який я розробляю, виходить з ладу, мені доведеться почекати, поки сокети очистять або змінять порт прослуховування, перш ніж я зможу вручну перезапустити його.

Спасибі за вашу допомогу.

Відповіді:


26

monitце чудовий спосіб відстежувати та перезавантажувати послуги, коли вони не спрацьовують - і, ймовірно, ви в кінцевому підсумку використовуєте це для інших необхідних служб (наприклад, Apache). У nixCraft є приємна стаття, в якій детально описано, як це використовувати для конкретних послуг, хоча monitсама функція має багато інших функцій.

Що стосується аспекту сокета, @galraen відповів на це місце далі.


Це ганьба , я повинен вирішити, що відповідь. Я мав би задати два окремі питання. @gelraen ваша відповідь щойно закінчила мої тижні пошуку рішення. Дякую вам так багато! @Redmumba дякую, Моніт виглядає добре!
Пріо

Незалежно від того, хто ви вирішите позначити правильним, обов'язково підтвердьте відповідь @ gelraen. Його місце правильне та дуже інформативне.
Андрій М.

19

Лише відповідаючи на частину перезавантаження служби. Я також натрапив на Monit, але на CentOS 7 systemd піклується про все це для вас. Вам просто потрібно додати ці два рядки до файлу .service (якщо їх там уже немає):

Restart=always
RestartSec=3

Довідково дивіться на https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ .

Якщо ви хочете створити власну системну службу, досить просто написати власний файл сервісу. Дивіться приклад нижче для користувальницького сервера http.

Запустіть редактор із нового файлу служби:

vim /etc/systemd/system/httpd.service

І додайте такий вміст, який ви можете редагувати за потребою:

[Unit]
Description=My httpd Service
After=network.target

[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Я хочу, щоб він запускався автоматично під час завантаження:

systemctl enable httpd

Розкажіть systemd про зміни та запустіть послугу:

systemctl daemon-reload
systemctl start httpd

А тепер ви можете побачити статус:

systemctl status httpd

Для ознайомлення див. Https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/


Так, саме, systemdстандартний менеджер сервісних послуг у більшості популярних дистрибутивів може це зробити для вас.
Рольф

13

Ви можете зателефонувати setsockopt(2)на прослуховування сокета за допомогою SO_REUSEADDR, тож ви зможете bind(2)його знову, не чекаючи закінчення всіх з'єднань. Ще одна можливість: скинути з’єднання з ядра. FreeBSD має tcpdropкоманду для цього, не знаю про Linux.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.