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

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

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

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

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

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

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

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

Что-то вроде этого может сработать (между перезапусками ожидается не менее 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...

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

Так что я бы посоветовал вам искать замену, а не исправлять ситуацию.

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