SystemdDoctor
служба не работает наблюдение за путями ресурсы

Наблюдение за каталогом перестаёт работать на больших деревьях

Наблюдение за путями опирается на механизм ядра с ограниченным числом наблюдений на пользователя. При большом числе наблюдаемых каталогов предел исчерпывается, и новые наблюдения не создаются молча — unit остаётся активным, но события не приходят.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Исчерпан предел числа наблюдений

    Предел считается на пользователя. Его исчерпание другими программами отражается и на unit наблюдения.

  2. Наблюдение за деревом каталогов вместо одного пути

    Механизм ядра не следит за деревом рекурсивно. Программа, делающая это, создаёт наблюдение на каждый каталог.

  3. События приходят пачками и запускают службу многократно

    Массовое изменение файлов даёт множество событий. Служба может запускаться чаще, чем успевает работать.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Предел числа наблюдений на пользователя.

sysctl fs.inotify.max_user_watches

За чем следит unit и что запускает.

systemctl show mywatch.path -p Paths -p Unit

Журнал наблюдения и запускаемой службы.

journalctl -u mywatch.path -u mywatch.service -n 30 --no-pager

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Исчерпан предел числа наблюдений
Почему происходит
Предел считается на пользователя. Его исчерпание другими программами отражается и на unit наблюдения.
Как проверить
Посмотрите предел и текущее использование.
sysctl fs.inotify.max_user_watches fs.inotify.max_user_instances
find /proc/*/fd -lname anon_inode:inotify 2>/dev/null | wc -l
Как исправить
Поднимите предел числа наблюдений настройкой ядра и закрепите её в файле настроек. На машинах со средами разработки предел по умолчанию мал.
2. Наблюдение за деревом каталогов вместо одного пути
Почему происходит
Механизм ядра не следит за деревом рекурсивно. Программа, делающая это, создаёт наблюдение на каждый каталог.
Как проверить
Посмотрите, за чем следит unit и сколько там каталогов.
systemctl cat mywatch.path | grep -E "^Path"
find /srv/data -type d 2>/dev/null | wc -l
Как исправить
Следите за конкретным путём, а не за большим деревом. Для деревьев лучше периодический обход по таймеру.
3. События приходят пачками и запускают службу многократно
Почему происходит
Массовое изменение файлов даёт множество событий. Служба может запускаться чаще, чем успевает работать.
Как проверить
Посмотрите частоту запусков службы.
journalctl -u mywatch.service --since "1 hour ago" --no-pager | grep -c Started
Как исправить
Добавьте задержку в саму службу или переходите на периодический обход. Unit наблюдения не умеет объединять события.

Пример вывода

Предел наблюдений исчерпан, события не приходят. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

$ sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 8192

$ systemctl is-active mywatch.path
active
# файлы в каталоге меняются, служба не запускается
$ journalctl -u mywatch.service --since "1 hour ago" --no-pager | grep -c Started
0

Связанные ошибки

Источники

  • systemd.path(5)
    Unit наблюдения за путями и их ограничения.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • inotify(7)
    Пределы числа наблюдений и экземпляров.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Проверено на systemd 255: при исчерпанном пределе события не приходят без сообщения.
    собственная проверка, systemd 255
    сверено 15 сентября 2026