4

Я ищу инструмент, чтобы сохранить задачу (перезапустить, если необходимо) на определенное время (в секундах), а затем убить ее и остановить. Например: keep_for 3600 rsync foo bar:faz должен попытаться синхронизировать каталог (перезапустить rsync в случае сброшенного соединения), но явно убить rsync и перезапустить его через час.

Я пытался написать сценарий оболочки для этого, но это было на удивление трудно написать, с множеством крайних случаев (например, дочерний процесс не был убит, или проблемы с выходом из оболочки). Итак ... может быть, уже есть инструмент для этого?

3 ответа3

3

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

Вот несколько битов информации из справочной страницы events(5) :

  • Ручной запуск:

    начать на <событие>
    Описывает при каких условиях начинать эту работу. Без этого раздела задание можно запустить только вручную с помощью команды initctl(8).

  • Респаун:

    респаун
    Это устанавливает флаги демона, службы и респауна для задания. Флаг респауна означает, что процесс будет перезапущен после его завершения.

  • Предел возрождения:

    предел возрождения [count [timeout]]
    Это настраивает пределы возрождения. Пределы возрождения применяются только в том случае, если для задания установлен флаг возрождения; установка предела не устанавливает автоматически возможность возрождения. Если процесс запускается более одного раза за интервал в секундах, задание будет остановлено автоматически, а не перезапущено. По умолчанию предел составляет 10 раз в течение 5 секунд.

Смотрите Начало работы.

0

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

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

Затем запустите цикл, который возрождает желаемую команду всякий раз, когда она завершается без успешного (нулевого) статуса.

Попытка отслеживать как тайм-аут, так и команду в одном цикле будет чрезмерно сложной.

-1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .