Зачем мониторить использование директорий?
Один из кейсов — это ситуация, при которой ваше приложение использует внешнюю утилиту, которая, в свою очередь, использует какие-то директории для своих конфигураций, кешей и т. д. Со списком использования директорий пользователю в контейнере можно выдать нужные права или же корректно настроить Persistent Volumes в Kubernetes.
Второй кейс — безопасность. С помощью этих утилит можно проверить, не трогает ли кто-то директорию /etc/passwd, или же просто настроить общий мониторинг использования файловой системы.
Установка и базовые команды
Описание утилит
Inotifywait — это утилита, которая ждет событий в указанных файлах/директориях и печатает их. Очень удобна для скриптов.
Тут — полный список параметров. А основные — следующие:
-m
,--monitor
— режим наблюдения: не завершаться после первого события;-r
,--recursive
— рекурсивно следить за всеми подкаталогами;-e <event>
— какие события отслеживать;--format <fmt>
— формат вывода строки события;--timefmt <fmt>
— формат времени.
Пример использования:
inotifywait -m -r -e modify,create --format '%T %w%f %e' --timefmt '%H:%M:%S' /tmp
Inotifywatch — это инструмент для сбора статистики по событиям, не для «прослушки вживую». Список параметров тут очень похожий:
-m
,--monitor
— режим наблюдения: не завершаться после первого события;-r
,--recursive
— рекурсивно следить за всеми подкаталогами;-e <event>
— какие события отслеживать;--format <fmt>
— формат вывода строки события;--timefmt <fmt>
— формат времени.
Пример использования:
inotifywatch -v -r -e modify,create,delete -t 10 /tmp
Debian-based
Установка тривиальна — просто выполните команду:
sudo apt install inotify-tools
Два основных инструмента:
- inotifywait — ждать событие (можно использовать в скриптах);
- inotifywatch — собрать статистику доступа.
Пример использования:
inotifywait -m -r ./my-dir
Docker
Можно собрать контейнер с inotify-tools, чтобы мониторить внутри или снаружи. Написать удобный скрипт, например:
#!/bin/bash
WATCH_DIR="/tmp/upload"
inotifywait -m -e create -e modify "$WATCH_DIR" | while read path action file; do
echo "$(date): $action on $file in $path"
done
И сделать dockerfile:
FROM debian:bookworm-slim
RUN apt update && apt install -y inotify-tools
COPY watcher.sh /watcher.sh
RUN chmod +x /watcher.sh
CMD ["/watcher.sh"]
Практика: исследуем утилиту soffice
Soffice — это утилита командной строки для LibreOffice. Она позволяет использовать функциональность этого приложения через командную строку. И так получилось, что в механизме конвертации формата rtf -> pdf появляется повышенная нагрузка на диск. Давайте смотреть.

Контейнер с soffice и inotify
Сначала напишем скрипт, который использует soffice и inotify.
convert.sh:
#!/bin/bash
if [ -z "${1:-}" ]; then
echo "Usage: $0 <path-to-input-file>"
exit 1
fi
INPUT_FILE="$1"
INPUT_DIR=$(dirname "$INPUT_FILE")
FILENAME=$(basename "$INPUT_FILE")
INOTIFY_LOG="$INPUT_DIR/inotify_${FILENAME}.log"
echo "Converting: $INPUT_FILE"
echo "Output dir: $INPUT_DIR"
echo "Inotify log: $INOTIFY_LOG"
echo "Starting inotify..."
inotifywait -m -r -e create -e modify -e delete /home /var/ --format '%T %w %f %e'
--timefmt '%Y-%m-%d %H:%M:%S' > "$INOTIFY_LOG" &
INOTIFY_PID=$!
soffice --headless --convert-to pdf "$INPUT_FILE" --outdir "$INPUT_DIR"
kill $INOTIFY_PID || true
echo "Done"
echo "inotify: $INOTIFY_LOG"
В этом скрипте мы:
- Объявляем переменные и входные параметры — путь к файлу, который надо конвертировать.
- Вызываем inotifywait, перечисляя список операций и директорий для мониторинга, а также указывая формат времени. Мониторинг запускается в фоне и пишет свой лог в переменную INOTIFY_LOG.
- Далее вызываем конвертацию через soffice.
- И убиваем лишние процессы.
Dockerfile:
FROM debian:bullseye-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update &&
apt-get install -y
libreoffice
libreoffice-gnome
inotify-tools
ca-certificates
bash
vim
curl
git &&
apt-get clean &&
rm -rf /var/lib/apt/lists/*
RUN useradd -ms /bin/bash converter
WORKDIR /app
RUN mkdir -p /files && chown converter:converter /files
COPY convert.sh /app/convert.sh
RUN chmod +x /app/convert.sh
USER converter
ENTRYPOINT ["/app/convert.sh"]
Тут всё просто: мы устанавливаем зависимости, создаем пользователя, копируем скрипт и запускаем его при старте контейнера.
Сборка контейнера:
docker build . -t inotify-soffic
e
Запуск контейнера:
docker run --rm -v "$PWD/documents:/documents" inotify-soffice /documents/1.rtf
При запуске контейнера монтируем директорию, где лежат тестовые rtf-файлы. В этой же директории появится результат.
Смотрим на результат
После запуска контейнера у меня появился файл inotify_1.rtf.log со следующим содержимым:

Тут можно увидеть операции, производимые с файловой системой, и на основе этой информации выполнить какие-то настройки уже приложения.
Ограничения
Ограничение на количество вотчей
Утилита не без недостатков. Основное ограничение — количество вотчей для директории на пользователя. Обычно это 8192, и посмотреть можно с помощью этой команды:
cat /proc/sys/fs/inotify/max_user_watches
Изменить ограничение можно следующей командой:
sudo sysctl fs.inotify.max_user_watches=524288
sudo sysctl -p
А еще буфер событий имеет ограниченный размер. При большой активности на файловой системе буфер может переполниться, и вы потеряете часть событий.
Признак:
inotifywait: Warnings of lost events
Заключение
Inotify-tools — отличный инструмент, когда:
- нужно быстро и просто понять, что происходит с файловой системой;
- требуется реагировать на действия в реальном времени;
- хочется трассировать поведение стороннего бинарника, не влезая в его код.
Совместим с Linux, а значит, почти с чем угодно. Иногда — незаменим.
Спасибо за прочтение! Еще я веду телеграм-канал, где рассказываю про программирование, — Flexible Coding.