ExecCondition=: проверка перед запуском службы
Задаёт команду, которая выполняется перед запуском и решает его судьбу: нулевой код — запускать, от 1 до 254 — пропустить без ошибки, 255 и выше — настоящая ошибка.
Что делает
Это программируемая версия условий: когда проверку нельзя выразить параметром Condition*=, её пишут скриптом. Например проверить доступность внешнего сервиса или актуальность данных.
Особенность в трактовке кодов: обычная команда с ненулевым кодом означает сбой, а тут коды 1–254 означают «не надо запускать». Это нужно учитывать в скрипте, иначе служба будет молча пропускаться.
Где ставится. В секции [Service]. Выполняется раньше ExecStartPre=.
Значения
| Значение | Что происходит |
|---|---|
ExecCondition=/usr/local/bin/should-run.sh | скрипт решает, запускать ли службу. |
ExecCondition=/usr/bin/test -f /etc/myapp/enabled | простая проверка стандартной командой. |
Пример
Запуск задачи только на активном узле кластера.
[Service]
Type=oneshot
ExecCondition=/usr/local/bin/is-primary-node
ExecStart=/usr/local/bin/nightly-report
Скрипт возвращает 0 на активном узле и 1 на остальных. Пассивные узлы просто пропустят задачу без записи о сбое.
Типичные ошибки
Коды 1–254 означают пропуск, а не ошибку: служба не запустится, и в мониторинге это не сбой.
Код 255 и выше — настоящая ошибка. Скрипты с exit 255 ведут себя неожиданно.
Команда выполняется при каждом запуске, включая перезапуски: делайте её быстрой.
Связанные ошибки
- Failed with result 'exec-condition' и condition failedСостояния exec-condition и condition failed: запуск не состоялся, потому что условие не выполнено. Это не сбой, а задуманное поведение.
- Failed with result 'exit-code'Состояние exit-code: служба завершилась с ненулевым кодом. Что это сообщение значит и где искать настоящую причину.
Рядом стоящие параметры
Источники
- systemd.service(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)