У меня есть этот runit сервис с run
и log/run
сценарии, правильно работающие.
Как это происходит, сам сервис может отказать по внешним причинам и не смог запускаться в течение многих минут. Способ по умолчанию, которым runit обрабатывает эту ситуацию, путем перезапуска сервиса каждые несколько секунд. Как я изменяю это поведение?
Мое последнее понимание состояло в том, чтобы добавить a check
сценарий и делает некоторое волшебство там, но это кажется намного более сложным, чем это должно быть. Существует ли лучший более простой путь?
Я не знаком с этой возможностью, однако, если бы моя задача заключалась в решении этой проблемы, и очень короткое чтение man-страницы не предлагало простой ручки для настройки такого поведения, я бы сделал следующее:
Либо расширить существующий скрипт запуска службы, либо, если это громоздко, вставить новый скрипт запуска в цепочку (которая, в свою очередь, запускает оригинальный стартовый скрипт). Вместо того, чтобы сразу же запускать службу, новый стартовый скрипт должен проверить, произошел ли последний запуск достаточно недавно. Это можно сделать, проверив сигнальный файл, созданный предыдущим стартом. Если файл не существует, скрипт может продолжить работу и прикоснуться к файлу и запустить службу. Если файл существует, скрипт должен проверить, достаточно ли старый файл. Если он недостаточно стар, он должен подождать (поспать) в цикле, пока файл не станет достаточно старым.
Что-то подобное может сработать (ждет не менее 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 для перезапуска монитора, но это далеко не все. Поэтому, я рекомендую Вам искать замену, а не исправлять неполадки.
Monit довольно старый, но он хорошо справляется со своей задачей, и я не знаю ничего лучше, если он появится. У него есть приятная особенность - не нужно больше злорадствовать после запуска, так что бейте к чертям из всего, что написано на языке сценариев. Последнее, что вам нужно, это то, что ваш монитор процесса умирает, потому что он не может получить память.
В файле ./finish
для этой службы, которая запускается после аварийного завершения, необходимо ограничить скорость перезапуска. Сценарий ./finish
получит код возврата из файла ./run
и оттуда можно будет определить, что делать и т. д. Для этого необходимо, чтобы ваш скрипт ./finish
громко кричал о сбоях, отправлял уведомления и перепрыгивал через огонь...