Гид по технологиям

Отслеживание и автоматическая обработка файлов с inotify-tools

5 min read Linux Обновлено 15 Dec 2025
Отслеживание и автоматическая обработка файлов
Отслеживание и автоматическая обработка файлов

Скриншот вывода inotifywatch

Быстрые ссылки

  • Установка inotify-tools и gzip
  • Эксперименты с inotify-tools
  • Отслеживание каталога и выполнение задачи

Краткое описание задачи

Задача: автоматически обрабатывать файлы сразу после их появления в каталоге. В примере файл перемещается в каталог “processed” и сжимается в gzip. Мы будем использовать подсистему inotify через утилиты inotify-tools.

Важно: inotify реагирует на события ядра о файловой системе. Это не опрос. Поэтому подход экономнее по ресурсам и быстрее, чем циклическая проверка.

Важно: inotify не гарантирует атомарность операций с теми программами, которые создают файлы нестандартным способом (например, запись с временным именем и переименование). Учтите это при проектировании рабочих процессов.

Установка inotify-tools и gzip

Если вы используете Ubuntu или другую Debian-подобную систему, используйте apt-get:

sudo apt-get install inotify-tools gzip

На других дистрибутивах используйте штатный менеджер пакетов (dnf, yum, pacman и т. п.).

Экспериментируем с inotify-tools

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

Создайте каталог incoming:

mkdir incoming

Запустите inotifywatch для просмотра всех событий:

inotifywatch -v incoming

Опция -v выводит дополнительную служебную информацию. Без флага -t команда будет собирать события до нажатия CTRL+C.

В новом терминале перейдите в incoming и создайте файл:

cd incoming/
touch newfile

Вернитесь в терминал с inotifywatch и прервите сбор Ctrl+C. Вы увидите таблицу с событиями: create, open, attrib, close_write и т. д. Эти события показывают, что произошло при создании файла.

Вывод inotifywatch с таблицей событий

Для нашей автоматизации достаточно отслеживать два события:

  • create — файл создан в каталоге,
  • moved_to — файл перемещён (mv) в каталог из другого места.

Запустим inotifywatch для этих событий:

inotifywatch -v -e create -e moved_to incoming

В другом терминале посмотрите сценарии создания и перемещения:

touch incoming/created
echo Testing123 >> incoming/created
touch /tmp/created2
mv /tmp/created2 incoming/

Остановите inotifywatch и посмотрите вывод — будут посчитаны только create и moved_to. Изменения содержимого (modify) были проигнорированы, поскольку мы явно этого не просили.

Отслеживание каталога и выполнение задачи

Теперь используем inotifywait, чтобы блокировать исполнение до события. Создайте каталог processed для уже обработанных файлов:

mkdir processed

Создайте скрипт watch-incoming.sh со следующим содержимым (оригинальный пример):

#!/bin/bash

TARGET=~/incoming/

PROCESSED=~/processed/

inotifywait -m -e create -e moved_to --format "%f" $TARGET \

| while read FILENAME

do

echo Detected $FILENAME, moving and zipping

mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME"

gzip "$PROCESSED/$FILENAME"

done

Пояснение: опция -m у inotifywait запускает режим мониторинга без выхода. Флаг –format “%f” выводит только имя файла. После получения имени файл перемещается и сжимается.

Сделайте скрипт исполняемым и запустите его:

chmod u+x watch-incoming.sh

./watch-incoming.sh

Откройте второй терминал и создайте файл в incoming. Затем сравните содержимое incoming и processed — файл будет перемещён и заменён его сжатой версией с суффиксом .gz.

Демонстрация: файл перемещён и сжат

Улучшение скрипта: надёжность и безопасность

Ниже — более надёжная версия скрипта с проверками:

#!/bin/bash
set -o pipefail

TARGET="$HOME/incoming"
PROCESSED="$HOME/processed"
LOGFILE="$HOME/watch-incoming.log"

mkdir -p "$TARGET" "$PROCESSED"

inotifywait -m -e create -e moved_to --format "%w%f" "$TARGET" |
while read -r FULLPATH; do
  BASENAME=$(basename -- "$FULLPATH")
  TIMESTAMP=$(date +"%Y%m%d-%H%M%S")
  echo "[$TIMESTAMP] Detected $BASENAME" >> "$LOGFILE"

  # Попытка атомарного перемещения с проверкой успешности
  if mv -- "$FULLPATH" "$PROCESSED/"; then
    if gzip -- "$PROCESSED/$BASENAME"; then
      echo "[$TIMESTAMP] Processed $BASENAME" >> "$LOGFILE"
    else
      echo "[$TIMESTAMP] ERROR: gzip failed for $BASENAME" >> "$LOGFILE"
    fi
  else
    echo "[$TIMESTAMP] ERROR: mv failed for $BASENAME" >> "$LOGFILE"
  fi

done

Ключевые улучшения:

  • Использование полного пути (%w%f) для надёжности.
  • Лог-файл для аудита.
  • Проверки успешности mv и gzip.
  • mkdir -p для создания директорий, если их нет.

Когда inotify не сработает как ожидается

  • Сетевые файловые системы (NFS, CIFS): поведение событий может отличаться или быть недоступным.
  • Программы, создающие файлы путём записи во временный файл и последующего переименования: вы получите событие moved_to, но рабочая логика должна учитывать целостность файла.
  • Высокая нагрузка: при огромном количестве событий буфер inotify может переполниться; это приведёт к пропуску событий.

Альтернативные подходы

  • systemd path unit: можно настроить .path и .service юниты для запуска обработки по появлению файлов.
  • incron: демон, похожий на cron, реагирует на события файловой системы с синтаксисом правил.
  • Поллинг (watchdog script с sleep): проще, но менее эффективен и медленнее в реакции.

Ментальная модель: события vs опрос

  • inotify: событие — ядро уведомляет процесс моментально. Подходит для быстрых реакций и экономии CPU.
  • Опрашивание: периодический опрос каталога. Подходит при ограничениях inotify (например, на сетевых FS) или если требуются дополнительные проверки целостности.

Роль‑ориентированные проверки перед развёртыванием

Администратор:

  • Убедиться, что лимит inotify (fs.inotify.max_user_watches) достаточен.
  • Настроить ротацию логов и мониторинг ошибок.

DevOps:

  • Тестировать сценарии массовых загрузок и поведение при переполнении.
  • Настроить оповещения при неудачных обработках.

Разработчик приложения:

  • Обеспечить атомарность записи файлов (писать во временный файл и переименовывать).
  • Добавить контрольные суммы или метаданные для проверки целостности.

Критерии приёмки

  • Скрипт обнаруживает create и moved_to и запускает обработку.
  • После создания файла он оказывается в processed в виде .gz.
  • Логи содержат отметки времени и статус ошибок.
  • Сценарии с высокой частотой событий не приводят к потере уведомлений (проверка на предмет переполнения буфера).

Тестовые случаи

  1. Создание нового файла командой touch — ожидаем create + обработка.
  2. Создание во временном каталоге, затем mv — ожидаем moved_to + обработка.
  3. Параллельная загрузка 100 файлов — проверяем устойчивость и отсутствие ошибок mv/gzip.
  4. Права доступа запрещают mv — проверяем лог и повторную обработку.

Примеры использования и расширения рабочих процессов

  • Добавить водяной знак к изображениям (используя ImageMagick) перед сжатием.
  • Перекодировать видео в MP4 с помощью ffmpeg.
  • Загрузить новые файлы в облако (AWS S3, Google Cloud Storage) после сжатия.
  • Отправлять уведомления в Slack/Telegram при ошибках обработки.

Безопасность и приватность

  • Убедитесь, что права доступа к incoming и processed ограничены только доверенным пользователям.
  • Если обрабатываются персональные данные, документируйте юридические основания и период хранения.

Быстрая шпаргалка (cheat sheet)

Команды для проверки установленного пакета:

which inotifywait
inotifywait --version

Показать значения лимитов inotify:

cat /proc/sys/fs/inotify/max_user_watches

Установить более высокий лимит (временно):

sudo sysctl -w fs.inotify.max_user_watches=524288

Постоянно через /etc/sysctl.conf:

fs.inotify.max_user_watches=524288

Краткое руководство по развёртыванию

  1. Установите inotify-tools и gzip.
  2. Создайте каталоги incoming и processed.
  3. Разработайте и протестируйте локально скрипт с логированием и проверками.
  4. Настройте systemd unit или запускайте скрипт через supervisor/systemd для автозапуска.
  5. Настройте мониторинг логов и алерты на ошибки.

Итог

inotify-tools — простой и эффективный способ реагировать на появление файлов в каталоге. Для большинства задач достаточно inotifywait и небольшого bash-скрипта. При производственных нагрузках добавьте логирование, обработку ошибок, проверку лимитов inotify и рассмотрите альтернативы (systemd path, incron) в зависимости от особенностей среды.

Ключевые термины: inotify — подсистема ядра Linux для уведомлений о событиях файловой системы; inotifywait/inotifywatch — утилиты из пакета inotify-tools для ожидания и подсчёта событий.

Конец.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Realtek HD Audio Manager — руководство
Аудио драйверы

Realtek HD Audio Manager — руководство

Сопоставление сетевых дисков через Group Policy
Windows Server

Сопоставление сетевых дисков через Group Policy

Приоритет Wi‑Fi в Windows 7 — как сменить сеть
Networking

Приоритет Wi‑Fi в Windows 7 — как сменить сеть

Взять право собственности на папку в Windows 11
Windows

Взять право собственности на папку в Windows 11

Downloads for You в Netflix: настройка и советы
Руководство

Downloads for You в Netflix: настройка и советы

Новые приложения в App Library на iPhone
iOS

Новые приложения в App Library на iPhone