Как контролировать скорость автоматического перезапуска службы runit?

У меня есть этот сервис runit с run а также log/run скрипты нормально работают.

Когда это происходит, сама служба может зависать по внешним причинам и может не запускаться в течение многих минут. По умолчанию runit обрабатывает эту ситуацию, перезапуская службу каждые несколько секунд. Как мне изменить это поведение?

Мое последнее понимание было добавить check Сценарий и сделать немного магии там, но это кажется гораздо сложнее, чем должно быть. Есть ли лучший способ проще?

3 ответа

Решение

Однако я не знаком с этим средством, если бы моей задачей было решить эту проблему, а очень короткое чтение справочной страницы не предлагало простой ручки для настройки этого поведения, я бы сделал следующее:

Либо расширьте существующий сценарий запуска службы, либо, если это громоздко, вставьте в цепочку новый сценарий запуска (который, в свою очередь, запускает исходный сценарий запуска). Вместо того, чтобы запускать сервис сразу, новый стартовый скрипт должен проверить, произошел ли последний запуск достаточно недавно. Это можно сделать, проверив файл сигнализации, созданный при предыдущем запуске. Если файл не существует, сценарий может продолжить и коснуться файла и запустить службу. Если файл существует, сценарий должен проверить, является ли файл достаточно старым. Если он недостаточно стар, он должен ждать (спит) в цикле, пока файл не станет достаточно старым.

Примерно так может работать (ждет не менее 1 минуты между перезапусками):

#!/bin/bash

SIGNALDIR=/tmp
SIGNALFILE=service.started

while /bin/true; do
        found=`find "${SIGNALDIR}" -maxdepth 1 -name "${SIGNALFILE}" -mmin -1 | wc -l`
        [ "${found}" -eq 0 ] && break
        echo "Waiting"
        sleep 10
done

touch "${SIGNALDIR}/${SIGNALFILE}"
original service start...

Вы должны ограничить скорость перезапусков в ./finish файл для этой службы, который запускается после аварийного завершения. ./finish скрипт получит код возврата от ./run и оттуда вы можете определить, что делать, и т.д. В этом отношении вы должны иметь ./finish скрипт громко кричит о сбоях и рассылает уведомления и прыгает в огне...

Я на самом деле не фанат управления процессами на основе инициализации (а runit в основном является заменой инициализации). Как вы обнаруживаете, простой перезапуск неудачных процессов, как только они умирают, не является особенно хорошей стратегией. Я использовал init, чтобы перезапустить monit, но это далеко. (потенциально OOM убийца может убить Монит).

Итак, я бы посоветовал вам искать замену, а не исправлять вещи.

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

Другие вопросы по тегам