systemd Error: ConditionPathExists failed for unit — Диагностика
Служба не стартует при загрузке или ручном вызове, не выдавая явного кода ошибки. В выводе systemctl status <unit> статус отображается как inactive (dead) с пометкой: ConditionPathExists=/path/to/file was not met или Starting was skipped because of an unmet condition.
| Условие в Unit-файле | Ожидаемое состояние | Фактический результат |
|---|---|---|
ConditionPathExists=/var/run/app.lock | Файл должен существовать | Файл отсутствует — запуск отменен без ошибки |
ConditionPathExists=!/etc/no-boot | Файл НЕ должен существовать (инверсия !) | Флаг-файл обнаружен — юнит пропущен |
ConditionDirectoryNotEmpty=/data | Каталог содержит файлы | Каталог пуст — отказ запуска |
- Команда
systemctl startзавершается успешно с кодом 0, но фоновый процесс фактически не появляется в системе. - В
journalctlфиксируется пропуск:systemd[1]: Starting Service... was skipped because of an unmet condition.
- Проверьте список условий, прописанных в конфигурации юнита:
systemctl cat <service_name> | grep Condition - Проверьте существование целевого пути, прав доступа к нему и наличие точек монтирования:
ls -la /path/to/required/file # Если путь содержит инверсию (!), убедитесь, что стоп-файл удален: ls -la /path/to/blocker/file - Проверьте порядок монтирования: если путь находится на отдельном разделе или сетевом диске (NFS), добавьте зависимость от монтирования в блок
[Unit]:RequiresMountsFor=/path/to/file - При необходимости переопределите условие через drop-in файл:
sudo systemctl edit <service_name> # В открывшемся окне сбросьте условие и задайте новое: [Unit] ConditionPathExists= ConditionPathExists=/new/correct/path/file - Примените изменения конфигурации и выполните тестовый запуск:
sudo systemctl daemon-reload sudo systemctl start <service_name>
Condition* в systemd спроектированы так, чтобы не считать их невыполнение аварийным сбоем (юнит не переходит в статус failed). Это штатный механизм селективного запуска.Частые вопросы (FAQ)
Почему при невыполнении ConditionPathExists сервис не помечается как failed?
Потому что директивы Condition* являются условиями применимости, а не проверки работоспособности. Если условие ложно, systemd считает, что запуск службы в данной конфигурации хоста просто не требуется.
Как полностью сбросить ConditionPathExists в systemd override?
В секции [Unit] drop-in файла нужно указать пустую строку 'ConditionPathExists=', чтобы очистить предыдущие значения, а затем при необходимости задать новые.
Что означает восклицательный знак перед путем (ConditionPathExists=!/file)?
Восклицательный знак означает логическое отрицание (NOT). Юнит будет запущен только в том случае, если указанный файл НЕ существует на диске.
Как проверить, выполнились ли условия юнита, через CLI?
Используйте команду systemctl status <unit> — в строке conditions будет явно указан статус проверки каждого условия.