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

Быстрые ссылки
- Установка 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 и т. д. Эти события показывают, что произошло при создании файла.

Для нашей автоматизации достаточно отслеживать два события:
- create — файл создан в каталоге,
- moved_to — файл перемещён (mv) в каталог из другого места.
Запустим inotifywatch для этих событий:
inotifywatch -v -e create -e moved_to incomingВ другом терминале посмотрите сценарии создания и перемещения:
touch incoming/createdecho Testing123 >> incoming/createdtouch /tmp/created2mv /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.
- Логи содержат отметки времени и статус ошибок.
- Сценарии с высокой частотой событий не приводят к потере уведомлений (проверка на предмет переполнения буфера).
Тестовые случаи
- Создание нового файла командой touch — ожидаем create + обработка.
- Создание во временном каталоге, затем mv — ожидаем moved_to + обработка.
- Параллельная загрузка 100 файлов — проверяем устойчивость и отсутствие ошибок mv/gzip.
- Права доступа запрещают 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Краткое руководство по развёртыванию
- Установите inotify-tools и gzip.
- Создайте каталоги incoming и processed.
- Разработайте и протестируйте локально скрипт с логированием и проверками.
- Настройте systemd unit или запускайте скрипт через supervisor/systemd для автозапуска.
- Настройте мониторинг логов и алерты на ошибки.
Итог
inotify-tools — простой и эффективный способ реагировать на появление файлов в каталоге. Для большинства задач достаточно inotifywait и небольшого bash-скрипта. При производственных нагрузках добавьте логирование, обработку ошибок, проверку лимитов inotify и рассмотрите альтернативы (systemd path, incron) в зависимости от особенностей среды.
Ключевые термины: inotify — подсистема ядра Linux для уведомлений о событиях файловой системы; inotifywait/inotifywatch — утилиты из пакета inotify-tools для ожидания и подсчёта событий.
Конец.
Похожие материалы
Realtek HD Audio Manager — руководство
Сопоставление сетевых дисков через Group Policy
Приоритет Wi‑Fi в Windows 7 — как сменить сеть
Взять право собственности на папку в Windows 11
Downloads for You в Netflix: настройка и советы