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

23

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

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

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

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

Pryo
источник

Ответы:

26

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

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

Андрей М.
источник
Это позор , я должен решить, что ответ. Я должен был задать два отдельных вопроса. @gelraen твой ответ только что закончил мои недели поиска решения. Спасибо вам так много! @ Редмумба спасибо, Монит выглядит хорошо!
Прио
Какой бы ответ вы ни решили пометить правильно, определенно ответ upvote @ gelraen. Его место на правильном и очень информативном.
Эндрю М.
19

Только отвечая на сервис перезапустите часть. Я также сталкивался с 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/

Nagev
источник
Да, именно systemdстандартный менеджер сервисов в большинстве популярных дистрибутивов может сделать это за вас.
Рольф
13

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

gelraen
источник
4

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

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

JeffG
источник
Спасибо, это похоже на вещь, но, к сожалению, я застрял с SysV init.
Прио