Назад | Перейти на главную страницу

Как автоматически перезапустить службу в случае сбоя в Linux

В Windows вы можете указать, что должно произойти в случае сбоя службы. Есть ли стандартный способ добиться того же в Linux (в частности, CentOS)?

Большая часть моего вопроса: как вы обрабатываете сокеты, которые остались открытыми - например, в состояниях TIME_WAIT, FIN_WAIT1 и т. Д.

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

Спасибо за вашу помощь.

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

Что касается аспекта сокетов, на это место ответил @galraen.

Только ответ на часть перезапуска службы. Я тоже сталкивался с Monit, но в CentOS 7 systemd позаботится обо всем этом за вас. Вам просто нужно добавить эти две строки в файл .service (если их там еще нет):

Restart=always
RestartSec=3

Видеть https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ для справки.

Если вы хотите создать собственную службу systemd, довольно просто написать собственный файл службы. См. Пример ниже для настраиваемого 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/

Вы можете позвонить setsockopt(2) для прослушивания сокета с SO_REUSEADDR, так что вы сможете bind(2) это снова, не дожидаясь истечения срока всех подключений. Другая возможность: сбросить соединения из ядра. FreeBSD имеет tcpdrop команда для этого, не знаю о Linux.

Если ваш дистрибутив linux использует Upstart вместо SysV init, то respawn ключевое слово делает это.

http://upstart.ubuntu.com/cookbook/#respawn