24
0
0
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
Назад

Мониторим активность на диске с помощью inotify-tools

Время чтения 13 минут
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
24
0
0
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники

Всем привет! Меня зовут Дмитрий Бахтенков, и я тимлид в компании Skillaz. Мы разрабатываем решение типа Human Capital Management (HCM, система управления человеческим капиталом) на ASP.NET Core.

В этой статье расскажу об одном удобном инструменте для мониторинга использования директорий в операционной системе. Когда у вас на сервере что-то активно использует диск — будь то утилита, сервис или подозрительный скрипт в контейнере, часто возникает желание понять, кто и зачем трогает те или иные директории. На помощь приходит набор утилит inotify-tools.

Мониторим активность на диске с помощью inotify-tools

Зачем мониторить использование директорий?

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

 

В этом скрипте мы:

  1. Объявляем переменные и входные параметры — путь к файлу, который надо конвертировать.
  2. Вызываем inotifywait, перечисляя список операций и директорий для мониторинга, а также указывая формат времени. Мониторинг запускается в фоне и пишет свой лог в переменную INOTIFY_LOG.
  3. Далее вызываем конвертацию через soffice.
  4. И убиваем лишние процессы.

 

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

 

Запуск контейнера:

 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.

Комментарии0
Тоже интересно
Комментировать
Поделиться
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники