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

У меня есть этот runit сервис с run и log/run сценарии, правильно работающие.

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

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

8
задан 26 September 2014 в 17:11
3 ответа

Я не знаком с этой возможностью, однако, если бы моя задача заключалась в решении этой проблемы, и очень короткое чтение 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...
3
ответ дан 2 December 2019 в 22:54

Я действительно не поклонник управления процессами на основе инитов (а рунит, по сути, является инитовой заменой). Как вы понимаете, простейший перезапуск вышедших из строя процессов, как только они умирают, не является особенно хорошей стратегией. Я использовал init для перезапуска монитора, но это далеко не все. Поэтому, я рекомендую Вам искать замену, а не исправлять неполадки.

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

1
ответ дан 2 December 2019 в 22:54

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

.
8
ответ дан 2 December 2019 в 22:54

Теги

Похожие вопросы