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

Служба перезапуска systemd, если она не слушает порт

Некоторое время я использую Systemd в Debian 8. Я использую параметр Restart = on-failure, чтобы активировать службу в случае сбоя.

Я хотел бы знать, есть ли способ принудительно перезапустить службу, если она не прослушивает определенный порт (даже если процесс все еще работает).

Причина, по которой мне это нужно, заключается в том, что мы разрабатываем новую функцию, чтобы исправить эту проблему, но это потребует времени. А пока нам нужен обходной путь.

Я разработал сценарий для проверки этого статуса:

#! /bin/bash
PORTS=( 1452 542 )
for port in ${PORTS[@]}; do
    netstat -anp | grep $port > /dev/null 2>&1
    if [ "$?" -ne 0 ]; then
        # Port blocked. Kill the running process and start it again after a while
done

Этот скрипт периодически запускается через cron, я знаю, что это подвох. Вот почему я хотел бы интегрировать это поведение в проверку Systemd. Это возможно?

Заранее спасибо.

Привет,

А.

Я бы посоветовал вам подойти к этому по-другому и использовать для этого специальный инструмент мониторинга.

Мой любимый инструмент мониторинга, который позволяет перезапускать службы в случае их сбоя или больше не прослушивания настроенных портов: контролировать: https://packages.debian.org/jessie/monit

В файле конфигурации, на этом сайте и в других местах есть множество примеров его настройки. Я приведу пример, чтобы дать вам представление о том, насколько просто его использовать. В примере используется init.d, однако его можно легко преобразовать для использования systemd.

Чтобы проверить, существует ли процесс, который прослушивает определенный порт и запускает его, когда этот тест не проходит:

check process example with pidfile /var/run/example.pid
start program = "/etc/init.d/example start"
start program = "/etc/init.d/example stop"
if failed host 192.0.2.10 port 80 protocol http then restart
if 5 restarts within 5 cycles then timeout

Вы можете оставить протокол http part и monit выполнят простое соединение tcp, чтобы проверить это. В протокол Аргумент выполняет более сложный тест, чтобы проверить, действительно ли что-то отвечает, например, на запрос http get.

Вам необходимо убедиться, что процесс или служба запущены таким образом, чтобы соответствующий pid файл создается в / var / run. Сам Monit об этом не заботится. Обычно, если служба запускается с помощью сценария инициализации или systemd, она должна иметь pid файл в / var / run.