Зачем мониторить использование директорий?
Один из кейсов — это ситуация, при которой ваше приложение использует внешнюю утилиту, которая, в свою очередь, использует какие-то директории для своих конфигураций, кешей и т. д. Со списком использования директорий пользователю в контейнере можно выдать нужные права или же корректно настроить 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-soffice 
Запуск контейнера:
 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.