В 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
ключевое слово делает это.