Подсистема ядра Linux inotify позволяет отслеживать события файловой системы (создание, удаление, изменение файлов) в режиме реального времени. Это мощный инструмент для автоматизации задач, отладки и мониторинга.
Как работает inotify?
find или du).inotify-toolsДля использования inotify через CLI нужны утилиты inotifywait и inotifywatch:
# Debian/Ubuntu sudo apt install inotify-tools # RHEL/CentOS/Fedora sudo yum install inotify-tools
inotifywait - мониторинг событийФормат вызова:
inotifywait [опции] путь
Примеры:
Мониторинг каталога на создание файлов:
inotifywait -m /path/to/dir -e create
-m: Режим постоянного мониторинга (без выхода после первого события).-e create: Отслеживать только событие создание.Отслеживание нескольких событий:
inotifywait -m /path/to/dir -e create,delete,modify
Рекурсивный мониторинг (включая подкаталоги):
inotifywait -m -r /path/to/dir
Выполнение команды при событии:
inotifywait -m /path/to/dir -e create | while read path action file; do echo "Создан файл: $file в $path" done
Автоматическое копирование новых файлов:
inotifywait -m -r -e create --format '%w%f' /source | while read newfile; do cp "$newfile" /destination/ echo "Скопирован: $newfile" done
inotifywatch - сбор статистикиФормат вызова:
inotifywatch [опции] путь
Примеры:
Статистика по событиям за 60 секунд:
inotifywatch -v -e create,delete -t 60 /path/to/dir
-t 60: Мониторинг 60 секунд.-v: Подробный вывод.inotify| Событие | Описание |
|---|---|
| access | Файл был прочитан. |
| modify | Файл был изменен. |
| attrib | Изменены метаданные (права). |
| close_write | Файл закрыт после записи. |
| close_nowrite | Файл закрыт без записи. |
| open | Файл открыт. |
| moved_from | Файл перемещен из каталога. |
| moved_to | Файл перемещен в каталог. |
| create | Создан файл/каталог. |
| delete | Удален файл/каталог. |
| delete_self | Удален сам отслеживаемый объект. |
--format для явного указания формата вывода:inotifywait -m /docs -e modify --format "%w %e %f" | while read path action file; do # Теперь $file будет содержать имя с пробелами if [[ "$file" == "important.docx" ]]; then cp "$path$file" /backup/ fi done
%w - путь (всегда с /)%e - событие%f - имя файла (включая пробелы)Полный разбор формата inotifywait
| Символ | Описание | Пример вывода |
|---|---|---|
| %w | Путь к каталогу (с /) | /docs/ |
| %e | Событие | MODIFY |
| %f | Имя файла | important.docx |
| %T | Время в формате ISO 8601 | 2023-10-05T14:30:45 |
Пример с датой:
inotifywait -m /docs --format "%T %w %e %f" | while read datetime path action file; do echo "[$datetime] Событие: $action, файл: $file" done
inotifyЛимиты ядра:
fs.inotify.max_user_watches).fs.inotify.max_user_instances).Проверка лимитов:
sysctl fs.inotify
Увеличение лимитов (добавить в /etc/sysctl.conf):
fs.inotify.max_user_watches = 524288 fs.inotify.max_user_instances = 8192
Применить: sysctl -p.
Рекурсивный мониторинг:
inotifywait с -r и фильтровать события.События перемещения:
delete и create, а не move.
Inotify- это стандарт де-факто для мониторинга ФС в Linux. Он эффективен, прост в использовании и интегрируется в любые сценарии автоматизации. Для большинства задач достаточноinotify-tools, но для сложных случаев рассмотрите альтернативы.
inotifywait остается запущенным для мониторинга?Как все устроено на примере команды: inotifywait -m /path/to/dir -e create,delete,modify
Ключевой флаг -m (monitor mode)
-m: По умолчанию inotifywait завершает работу после первого события.-m: Команда переходит в режим постоянного мониторинга и не завершается, пока её не прервут вручную (например, Ctrl+C).Технический процесс работы
Инициализация:
inotifywait создает экземпляр inotify через системный вызов inotify_init()./path/to/dir с помощью inotify_add_watch(), указывая события: create, delete, modify.Ожидание событий:
read() или poll()).inotifywait о событиях в реальном времени (без опроса ФС).Вывод событий:
inotifywait выводит информацию в stdout:/path/to/dir/ CREATE newfile.txt
Почему команда не завершается?
-m запускает внутренний цикл, который обрабатывает события до явного прерывания.&), она продолжит мониторинг.$ inotifywait -m /tmp -e create,delete,modify
Вывод при событиях:
/tmp/ CREATE test.txt # Создан файл test.txt /tmp/ MODIFY test.txt # Файл изменен /tmp/ DELETE test.txt # Файл удален
Команда будет ждать новые события бесконечно, пока вы не нажмете Ctrl+C.
whileinotifywait -m /path/to/dir -e create,delete,modify | while read path action file; do echo "Событие: $action над файлом $file в $path" # Ваши действия здесь done
while.inotifywait -m /path/to/dir -e create > events.log &
events.log.kill %1 (где %1 — ID фонового процесса).Ctrl+C.SIGTERM:# Запуск в фоне inotifywait -m /path/to/dir & # Сохраняем PID процесса PID=$! # Остановка позже kill $PID
-m| Параметр | Поведение |
|---|---|
| Без -m | Завершается после первого события. |
| С -m | Работает бесконечно, пока не прервана. |
| Вывод | Каждое событие выводится в новой строке. |
| Ресурсы | Минимальная нагрузка (ядро уведомляет о событиях, а не опрашивает ФС). |
| Рекурсия | Для мониторинга подкаталогов добавьте -r (но это увеличит нагрузку). |
Для остановки всегда используйте
Ctrl+Cили командуkill. Это делаетinotifywaitидеальным инструментом для мониторинга ФС в реальном времени.
inotifywait -m /docs -e modify | while read path action file; do if [[ "$file" == "important.docx" ]]; then cp "$path$file" /backup/ echo "Резервная копия создана: $(date)" fi done
inotifywait -m /uploads -e create | while read; do rm -f /uploads/* echo "Очищено в $(date)" done
inotifywait -m -e modify /etc/nginx/nginx.conf | while read; do systemctl reload nginx echo "Nginx перезапущен" done
inotifywait -m -e modify /var/log/syslog | while read; do tail -n 1 /var/log/syslog done
inotifyentr (запуск команд при изменении файлов)# Установка sudo apt install entr # Пример: перезапуск сервиса при изменении конфигов echo /etc/nginx/*.conf | entr -r systemctl reload nginx
watch (периодическое выполнение команд)# Проверка содержимого каталога каждые 2 секунды watch -n 2 'ls -l /path/to/dir'
systemd.path (мониторинг через systemd)Пример юнита для автоматического запуска скрипта при появлении файлов:
# /etc/systemd/system/monitor.path [Unit] Description=Monitor directory [Path] PathModified=/path/to/dir Unit=monitor.service [Install] WantedBy=multi-user.target
# /etc/systemd/system/monitor.service [Unit] Description=React to changes [Service] ExecStart=/path/to/script.sh
systemctl enable --now monitor.path