Я работал над сервисом systemd, чтобы обернуть сценарий администрирования, и я пытаюсь изящно справиться с этим, полностью сломав его.
Прямо сейчас у меня есть Restart
установлен в always
поэтому он попытается снова, когда что-то не удастся, но некоторые состояния отказа требуют внимания (отсутствующий файл конфигурации, неправильный SQL и т.д.), поэтому я не хочу, чтобы он постоянно вращался в фоновом режиме в некорректируемом состоянии.
я нашел StartLimitInterval
, StartLimitBurst
, и StartLimitAction
, который перестает пытаться перезапустить его после X сбоев через Y секунд, но оказывается, что единственные действия, доступные для StartLimitAction
перезагружают или выключают машину, что немного перебор.
Я смотрел на OnFailure
и написал мини-сервис для отправки оповещения по электронной почте когда он срабатывает, но OnFailure срабатывает каждый раз, когда служба умирает, а не когда она достигает предела запуска, поэтому мы получаем кучу писем вместо одного.
Есть идеи, что попробовать дальше?
Из Справочная страница systemd.unit:
OnFailure =
Список, разделенный пробелами, из одного или нескольких модулей, которые активируются, когда этот модуль переходит в состояние «сбой». Сервисный блок, использующий Restart =, переходит в состояние сбоя только после того, как будут достигнуты пределы запуска.
Однако второе предложение кажется новым ограничением, поскольку оно есть в руководстве для версии 241 systemd на моих установках Arch, но не в версии 219 на моей установке CentOS 7.
Вы можете проверить свою версию systemd с помощью systemctl --version
Я знаю, что это старый вопрос, но просто хотел поделиться со всеми, у кого есть такая же проблема.
Startlimitaction
может быть то, что вы хотите. На странице руководства говорится
... Принимает одно из следующих значений: перезагрузка, принудительная перезагрузка, немедленная перезагрузка, отключение питания, принудительное отключение питания или немедленное отключение питания. Если ничего не задано, достижение предела скорости не вызовет никаких действий, кроме того, что запуск не будет разрешен..
Кажется, что установка для действия startlimit значения none может сделать то, что вы хотите.