Path-unit не реагирует на изменения
Unit вида .path следит за путём и запускает службу при событии. Если ничего не происходит, обычно включена только служба, наблюдение задано не за тем объектом, или служба уже активна и запускать её не нужно.
Что это значит
Важная тонкость: PathExists= срабатывает, когда файл есть, и повторно не сработает, пока файл не исчезнет. Для обработки потока файлов нужен DirectoryNotEmpty= — он срабатывает снова, пока каталог не пуст.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
В автозапуск включена служба, а не path-unit
Наблюдение ведёт
.path, и включать нужно его. Служба ждёт вызова и сама ничего не отслеживает. -
Наблюдение задано не за тем объектом
PathChanged=для каталога срабатывает на изменения самого каталога, а не файлов внутри. Для содержимого нуженPathModified=илиDirectoryNotEmpty=. -
Служба уже активна
Если служба работает, событие ничего не даёт: запускать нечего. При
RemainAfterExit=yesона остаётся активной после отработки и больше не вызывается. -
Путь недоступен для наблюдения
Каталога нет, или он на файловой системе без поддержки уведомлений ядра (часть сетевых файловых систем). Тогда события не приходят.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Все наблюдатели и их состояния.
systemctl list-units --type=path --no-pagerЗа чем следит unit и что запускает.
systemctl show myapp.path -p Paths -p UnitСобытия наблюдателя и запуски службы рядом.
journalctl -u myapp.path -u myapp.service -n 30 --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Наблюдение ведёт
.path, и включать нужно его. Служба ждёт вызова и сама ничего не отслеживает.
- Как проверить
-
Посмотрите состояния включения.
systemctl is-enabled myapp.path myapp.service systemctl status myapp.path --no-pager | head -8
- Как исправить
-
Включите наблюдатель, а не службу: в автозапуске должен быть path-unit, он и вызовет службу по событию.
sudo systemctl enable --now myapp.path
- Почему происходит
PathChanged=для каталога срабатывает на изменения самого каталога, а не файлов внутри. Для содержимого нуженPathModified=илиDirectoryNotEmpty=.
- Как проверить
-
Посмотрите параметры наблюдения.
systemctl show myapp.path -p Paths
- Как исправить
-
Выберите подходящий параметр:
DirectoryNotEmpty=для очереди файлов,PathModified=для изменяемого файла.[Path] DirectoryNotEmpty=/var/spool/myapp
- Почему происходит
- Если служба работает, событие ничего не даёт: запускать нечего. При
RemainAfterExit=yesона остаётся активной после отработки и больше не вызывается.
- Как проверить
-
Посмотрите состояние службы.
systemctl show myapp.service -p RemainAfterExit -p ActiveState
- Как исправить
-
Уберите
RemainAfterExit=yesу вызываемой задачи: она должна завершаться, чтобы следующее событие её запустило.
- Почему происходит
- Каталога нет, или он на файловой системе без поддержки уведомлений ядра (часть сетевых файловых систем). Тогда события не приходят.
- Как проверить
-
Проверьте путь и тип файловой системы.
ls -ld /var/spool/myapp findmnt -T /var/spool/myapp -o TARGET,FSTYPE
- Как исправить
-
Создайте каталог (можно через
MakeDirectory=yesв unit) и следите за путём на локальной файловой системе.
Пример вывода
Наблюдатель активен, но служба ни разу не запускалась. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
● myapp.path - Watch spool directory
Loaded: loaded (/etc/systemd/system/myapp.path; enabled; preset: enabled)
Active: active (waiting) since Mon 2026-09-15 09:00:02 MSK; 3h ago
○ myapp.service - Process spool
Loaded: loaded (/etc/systemd/system/myapp.service; static)
Active: inactive (dead)
Связанные ошибки
- Таймер активен, но не срабатывает Таймер systemd в состоянии active, но служба не запускается. Разбор: нет условия срабатывания, таймер не включён, ошибка в OnCalendar.
- Таймер не работает после перезагрузки Таймер работал, пока его запускали вручную, но после перезагрузки не активен: не выполнено включение или нет WantedBy=timers.target.
- status=0/SUCCESS, но служба считается упавшей Программа завершилась успешно, а systemctl показывает inactive или failed. Разбор: Type=simple против forking, RemainAfterExit, демонизация.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- Docker: unable to configure the Docker daemon — конфликт -H и hosts Адрес прослушивания задан дважды: ключом -H в unit-файле и параметром hosts в daemon.json. Демон отказывается стартовать.
Источники
-
systemd.path(5)
PathExists=, PathChanged=, PathModified=, DirectoryNotEmpty=, MakeDirectory=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на каталоге очереди: PathExists срабатывает однократно, DirectoryNotEmpty — пока есть файлы.