Condition*= и Assert*=: условия запуска unit
Условия проверяются перед запуском. Если условие не выполнено, unit пропускается без ошибки. Утверждения (Assert*=) при невыполнении дают настоящую ошибку с записью в журнал.
Что делает
Разница принципиальна. Условие — это «не надо запускать»: служба остаётся неактивной, состояние не становится failed, мониторинг молчит. Утверждение — это «так быть не должно»: unit помечается упавшим и попадает в список сбоев.
Условий много: существование пути, тип окружения (физическая машина или контейнер), архитектура, первый запуск системы, наличие пользователя. Перед именем можно поставить восклицательный знак — тогда условие инвертируется.
Где ставится. В секции [Unit]. Работают для служб, таймеров, сокетов и прочих типов unit.
Значения
| Значение | Что происходит |
|---|---|
ConditionPathExists=/etc/myapp/enabled | запускаться только если файл есть. |
ConditionPathExists=!/etc/myapp/disabled | инверсия: запускаться, если файла нет. |
ConditionVirtualization=!container | не запускаться в контейнере. |
ConditionFileNotEmpty=/etc/myapp/list | файл должен существовать и быть непустым. |
AssertPathExists=/srv/data | отсутствие пути — ошибка, а не пропуск. |
Пример
Служба, включаемая наличием файла-флага.
[Unit]
ConditionPathExists=/etc/myapp/enabled
ConditionVirtualization=!container
[Service]
ExecStart=/usr/local/bin/myapp
Такой приём удобен для одного unit-файла на парк машин: где файл-флаг есть, служба работает, где нет — тихо пропускается.
Типичные ошибки
Невыполненное условие оставляет службу неактивной без признаков ошибки: в мониторинге это выглядит как «не запущена».
Условие на путь, который появляется позже (монтирование), не выполняется при загрузке: нужен RequiresMountsFor=.
Утверждения помечают unit упавшим — не используйте их там, где пропуск нормален.
Связанные ошибки
- Failed with result 'exec-condition' и condition failedСостояния exec-condition и condition failed: запуск не состоялся, потому что условие не выполнено. Это не сбой, а задуманное поведение.
- Dependency failed for … и результат 'dependency'Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
Рядом стоящие параметры
Источники
- systemd.unit(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)