Systemd http проверка работоспособности

У меня есть служба на Redhat 7.1, которую я использую для управления запуском, остановкой, перезапуском и состоянием systemctl. Один раз статус systemctl вернулся в активное состояние, но приложение, стоящее за службой, ответило http-кодом, отличным от 200.

Я знаю, что могу использовать Monit или Nagios, чтобы проверить это и выполнить перезапуск systemctl, но я хотел бы знать, существует ли что-то по умолчанию при использовании systemd, чтобы мне не нужно было устанавливать другие инструменты.

Моим предпочтительным решением было бы перезапустить мою службу, если код возврата http отличается от 200 полностью автоматически без других инструментов, кроме самого systemd - (и, возможно, с возможностью уведомить комнату Hipchat или отправить электронное письмо...)

Пробовал гуглить тему - безрезультатно. Пожалуйста помоги :-)


person clausfod    schedule 24.09.2016    source источник
comment
@shellter, я не согласен с тем, что это не по теме. Проверка работоспособности не вызывает беспокойства у конечных пользователей, а в большей степени является проблемой/вопросом разработки. Не могли бы вы описать причину решения о закрытии?   -  person Charles Duffy    schedule 26.09.2016
comment
... Я мог бы увидеть аргумент, что это скорее проблема операционной системы (более актуальная для ServerFault, чем для StackOverflow), но я не уверен, что этот аргумент является убедительным, поскольку создание функциональности, которую хочет OP, требует разработки знание - мой ответ дает указатель на конкретный API для использования, а это не тот вид знаний, который, как мы ожидаем, будет актуальным в обсуждении ServerFault.   -  person Charles Duffy    schedule 26.09.2016
comment
...требуются знания в области разработки и изменения кода, поскольку необходимо написать код, который вызывает sd_notify() с результатами проверки работоспособности или выполняет эквивалентную запись сокета.   -  person Charles Duffy    schedule 21.11.2016


Ответы (1)


Краткий ответ

В systemd есть собственный (на основе сокетов) метод проверки работоспособности, но он не основан на HTTP. Однако вы можете написать прокладку, которая опрашивает статус по HTTP и перенаправляет его на собственный механизм.


Длинный ответ

В мире systemd правильно использовать механизм сокетов sd_notify, чтобы информировать систему инициализации, когда ваше приложение полностью доступно. Используйте Type=notify для своего сервиса, чтобы включить эту функцию.

Вы можете напрямую писать в этот сокет с помощью вызова sd_notify() или вы можете проверить переменную среды NOTIFY_SOCKET, чтобы получить имя, и ваш собственный код запишет READY=1 в этот сокет, когда приложение возвращает 200 с.

Если вы хотите передать это отдельному процессу, который опрашивает ваш процесс через HTTP, а затем записывает данные в сокет, вы можете сделать это -- убедитесь, что NotifyAccess установлен соответствующим образом (по умолчанию только основной процесс службы может использовать писать в сокет).


Поскольку вы заинтересованы в обнаружении случаев сбоя приложения после его полной инициализации и запуске перезапуска, сокет sd_notify подходит и для этого сценария:

Отправьте WATCHDOG_USEC=..., чтобы установить количество времени, которое допустимо между успешными тестами, затем WATCHDOG=1 каждый раз, когда у вас есть успешная самопроверка; всякий раз, когда в течение настроенного периода не будет обнаружено успешного теста, ваша служба будет перезапущена.

person Charles Duffy    schedule 24.09.2016
comment
Большое спасибо за ответ :-) - person clausfod; 26.09.2016