Inotify linux как установить

Обновлено: 05.07.2024

Linux — гибкая операционная система, которая вооружает пользователя широкими возможностями. Вот, например, нам необходимо осуществить мониторинг изменения файловой системы. Для этого в Linux появился отличный инструментарий, да ещё, ориентированный на консоль. О нем и пойдет речь далее.

Inotify — подсистема ядра

Inotify — это подсистема ядра Linux, которая отслеживает изменения файловой системы в Linux (открытие, чтение, создание, удаление, перемещение, изменение атрибутов и др.). Впервые данная подсистема появилась в релизе ядра 2.6.13. Другими словами, подсистема позволяет получить информацию о действиях, которые были осуществлены с любым интересующим вас файлом.

Inotify-tools: знакомство и установка

Inotify-tools — это набор утилит, которые посредством командной строки позволяют работать с подсистемой Inotify. Кроме того, составной часть проекта Inotify-tools является соответствующая библиотека — libinotifytools , которая позволяет с легкостью задействовать интерфейс, предоставляемый подсистемой Inotify.

Мы будем использовать операционную систему Ubuntu 11.10. Установка Inotify-tools в ней не займёт много времени. Что касается других дистрибутивов (последних версий), то рассматриваемый пакет утилит доступен из репозиториев для openSUSE 12.1, Debian 6.x, Arch и других.

Запустите терминал или перейдите в консоль, а затем дайте команду:

Кстати, если вы обратите внимание, то увидите, что, помимо inotify-tools будет установлен пакет — libinotifytools0. Это та самая библиотека, о которой мы говорили выше, и которая необходима для работы inotify-tools.

Работаем с Inotify-tools

В пакет inotify-tools входят следующие утилиты: inotifywatch и inotifywait . inotifywatch — эта утилита, которая дает представление о том, какую информацию можно получить с помощью подсистемы Inotify, а также осуществляет сбор статистической информации о соответствующих событиях файловой системы (открытие файлов, удаление и т. д. - далее, в этом контексте будут иметься ввиду события Inotify).

Рассмотрим на примерах, как это работает. Откройте терминал и дайте команду:

После чего вы увидите на экране примерно следующее (см. рис. 1)


Рисунок 1. inotifywatch в процессе работы

Это означает, что inotifywatch успешно запущен и осуществляет рекурсивный (опция "-r") сбор информации о действиях с файловой системой в домашнем каталоге текущего пользователя. Например, запустим браузер Mozilla Firefox и закроем его. Далее нажмём в терминале "Ctrl"+"C", чтобы остановить inotifywatch . В итоге мы увидим примерно следующее (см. рис. 2, для увеличения щелкните по рисунку мышкой).


Рисунок. 2. Вывод Inotifywatch

В этом выводе вы можете увидеть к каким файлам обращался Mozilla Firefox во время своей работы.

При помощи опции "-e" можно добиться более гибкого вывода информации от inotifywatch . Так, например, нам необходимо узнать какие файлы или каталоги во время своей работы открывает Mozilla Firefox. Дадим следующую команду:

После этого, запустим Mozilla Firefox, поработаем в нем, а затем закроем. Далее остановим в терминале, как в прошлый раз ("Ctrl"+"C"), и работу самой утилиты inotifywatch . В выводе мы уже увидим все лишь три "колонки" — total, open и filename (см. рис. 3).


Рисунок 3. Вывод inotifywatch при использовании опции "-e"

Воспользовавшись справкой для данной утилиты, вы можете увидеть, что inotifywatch способна собирать информацию о довольно большом количестве событий. Получить справку по inotifywatch можно с помощью соответствующего руководства man ( man inotifywatch ), а также указав перед данной командой опцию - "-h".

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

Дайте следующую команду:

где опция "-m" — указывает осуществлять мониторинг событий, без этой опции inotifywait прекратит работу после первого события; опция "-r" - указывает осуществлять рекурсивный сбор информации о действиях с файловой системой.

А запустив Mozilla Firefox, вы увидите все файлы, к которым обращается браузер, а также, действия, которые он с ними осуществляет (создание временных файлов, обращение к внутренним базам данных sqlite и т.д.).

Для получения справки по работе с inotifywait воспользуйтесь соответствующей страницей руководств, а также используйте опцию "-h".

Заключение

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

Источники и дополнительные материалы:

5. К. Вервлоесем. Inotify: Следим за системой // Linux Format. - N 1. - 2011. - с. 80 - 83.

Выполнение задачи при добавлении файла в каталог Linux

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

Если вы используете Ubuntu или другой дистрибутив на основе Debian, тогда для установки inotify-tools в вашу операционную систему используйте apt-get . В других дистрибутивах Linux используйте инструмент управления пакетами вашего дистрибутива Linux.

Использование inotify-tools

Давайте начнем с просмотра каталога и выяснения, какие события инициируются при появлении новых файлов. Создайте новый каталог с именем «incoming»:

Запустите мониторинг этого каталога, выполнив команду:

Команду прикажет inotify следить за всеми событиями в папке «incoming». Параметр -v заставляет инструмент выводить дополнительную информацию о том, что он делает. Если не указать параметр тайм-аута -t, команда будет собирать события до тех пор, пока мы не завершим работу с помощью CTRL + C. На этом этапе наш терминал должен выглядеть примерно так:

Выполнение действия при добавлении файла в каталог Linux

Откройте новое окно терминала (или вкладку) и перейдите в папку «incoming». Используйте команду touch, чтобы создать новый файл с именем «newfile».

Теперь вернитесь к первому окну терминала и остановите inotifywatch, нажав CTRL + C.

Выполнение действия при добавлении файла в каталог Linux

Таблица событий будет передана на консоль с указанием одного экземпляра «create», «open», «attrib» и «close_write». Эти четыре события произошли, когда мы использовали touch для создания нового файла и установки прав доступа к нему. Это лишь некоторые из множества событий, которые можно отследить в файловой системе с помощью инструментов inotify. Вы можете увидеть полный список на главной странице inotifywatch.

Для мониторинга папки на выполнение определенных действий при появлении файла в каталоге Linux нас интересуют два события:

Давайте попробуем inotifywatch снова, но на этот раз прикажем ему мониторить только эти два события. Запустите эту команду в первом окне терминала:

Во втором окне или вкладке терминала давайте попробуем создать новый файл, изменить его содержимое, а затем переместить файл из другого места в целевой каталог. Все эти команды запускаются из домашнего каталога.

Вернитесь к первому окну терминала и остановите inotifywatch, нажав CTRL + C. Мы увидим следующий вывод:

Выполнение действия при добавлении файла в каталог Linux

Были подсчитаны только два события: создание файла с именем «create.txt» и перемещение существующего файла с именем «made2.txt». Все остальное, например, изменение «create.txt», было проигнорировано.

Мониторинг папки и выполнение задачи

Теперь, когда мы знаем, какие события следует отслеживать, мы можем использовать другой инструмент, называемый inotifywait, чтобы блокировать выполнение до тех пор, пока файл не будет создан или перемещен в наш целевой каталог. Мы будем использовать те же аргументы, что и для inotifywatch, а также укажем, как мы хотим, чтобы имя файла выглядело.

Затем создайте новый скрипт с именем «watch-incoming.sh» и добавьте в него следующее:

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

Сценарий выполняет команду inotifywait с параметром -m. Каждый раз, когда обнаруживается новое событие, имя файла передается команде чтения и вводится в переменную «FILENAME». Выполняется блок в цикле while, в котором файл сначала перемещается в «обработанный» каталог, а затем распаковывается. Исходный файл заменяется сжатым файлом, а имя файла заканчивается на «.gz».

Давайте предоставим права на выполнение этого скрипта и запустим его из нашего домашнего каталога.

Откройте второе окно терминала и создайте новый файл во «входящем» каталоге. Перечислите содержимое как «входящего», так и «обработанного» каталога, чтобы увидеть результаты обнаруженного события:

Выполнение действия при добавлении файла в каталог Linux

Необработанный текстовый файл, который мы скопировали в папку «incoming», был обнаружен сценарием, скопирован в папку «processed» и затем сжат с помощью gzip.

Теперь мы можем выполнять некоторые интересные задачи. Например, мы могли бы наложить водяной знак на файлы изображений, сжать оригинальные видео в формат mp4 и даже загрузить каждый новый файл, который мы видим, в корзину Amazon S3. Этот сценарий является хорошей отправной точкой для развертывания ваших собственных рабочих процессов и автоматизации общих задач в вашей системе.

Блог про Linux, Bash и другие информационные технологии

Программы inotifywait и inotifywatch

Эти программы как раз и помогут нам обеспечить необходимый функционал отслеживания изменений файловой системы. В Debian и Ubuntu они входят в пакет inotify-tools. Установка пакета:

Как работает inotifywatch

Программа inotifywatch собирает статистику доступа к файловой системе при помощи inotify. По окончании работы программа выводит статистическую информацию в виде таблицы, включающей информацию об общем количестве событий, о количестве событий каждого типа и файле, для которого произошло событие. У неё есть ряд параметров, которые можно использовать для изменения параметров работы программы.

Типы событий для отслеживания:

access Отслеживаемый файл или файл в отслеживаемой директории был прочитан
modify Отслеживаемый файл или файл в отслеживаемой директории был записан
attrib Метаданные отслеживаемого файла или файла в отслеживаемой директории были изменены. Сюда включаются изменения времени доступа и изменения, права доступа, расширенные атрибуты и так далее.
close_write Отслеживаемый файл или файл в отслеживаемой директории был закрыт после открытия его в режиме записи. Это не говорит о том, что в файл были записаны какие-то данные.
close_nowrite Отслеживаемый файл или файл в отслеживаемой директории был закрыт после открытия в режиме только для чтения
close Отслеживаемый файл или файл в отслеживаемой директории был закрыт, при этом неважно, в каком режиме он был открыт. Имейте в виду, что это событие рализовано просто прослушиванием обоих событий close_write и close_nowrite, поэтому все события будут выведены именно как одно из них, а не как CLOSE. Этот тип скорее как сокращение для двух других типов событий
open Отслеживаемый файл или файл в отслежваемой директории был открыт
moved_to Файл или директория были перемещены в отслеживаемую директорию. Это событие возникает даже в том случае, когда файл был перемещен в пределах одной и той же директории
moved_from Файл или директория были перемещены из отслеживаемой директории. Это событие возникает даже в том случае, когда файл был перемещен в пределах одной и той же директории
move Файл или директория были перемещены из отслеживаемой директории или в неё. Это событие реализовано аналогично событию CLOSE, то есть, скорее как псевдоним для двух типов событий, moved_to и moved_from,поэтому все события будут выведены именно как одно из них, а не как MOVE
move_self Отслеживаемый файл или директорию были перемещены. После возникновения этого события файл или директория больше не отслеживается.
create Файл или директория были созданы в отслеживаемой директории
delete Файл или директория были удалены из отслеживаемой директории
delete_self Отслеживаемый файл или директория были удалены. После этого события файл или директория больше не отслеживается. Обратите внимание, что это событие может произойти, даже если оно явно не слушалось.
unmount Файловая система, накоторой находится отслеживаемый файл или директория, была отмонтирована. Поле возникновения этого события файл или директория перестает отслеживаться.Обратите внимание, что это событие может произойти, даже если оно явно не слушалось.

Пример работы программы inotifywatch:

Как работает inotifywait

Программа inotifywait работает несколько иначе. Она ждет возникновения события и выводит информацию об этом событии сразу, не дожидаясь сигнала прерывания.

Параметры inotifywait очень похожи на параметры inotifywatch:

События, которые отслеживаются, точно такие же, как для программы inotifywatch.

Пример работы программы inotifywait:

Пишем скрипт, который использует inotify

Прежде всего определимся с условиями задачи, которую нам предстоит решить. Есть некоторые директории, куда пользователи загружают файлы (пусть это будут домашние директории пользователей, /home/ИМЯ-ПОЛЬЗОВАТЕЛЯ). Иногда пользователи эти файлы удаляют, поэтому нам нужно отслеживать изменения и при появлении новых файлов (или новых версий уже существующих файлов) копировать их в директорию /backup/ИМЯ-ПОЛЬЗОВАТЕЛЯ.

Для реализации нам нужно отслеживать изменения файловой системы, на которой находится директория /home, определять, что произошло событие закрытия файла после записи в него, получать директорию, в которой произошло закрытие файла, имя самого файла, определять имя директории, в которую планируется копировать файл, создавать её, если она еще не существует, и, собственно, копировать этот файл в эту директорию.


Здравствуй, дорогой друг. Если ты задался вопросом, как в Linux отлавливать изменения в файловой системе, то я дам тебе ответ. Это Inotify.

Inotify - это подсистема ядра Linux, которая дает информацию о создании или изменении любого файла или директории в используемой файловой системе.
Inotify появилась впервые в ядре 2.6.13. С тех пор прошло достаточно много времени, и подсистема inotify хорошо себя зарекомендовала.

Работу с inotify предоставляет пакет inotify-tools. Двумя его основными утилитами являются inotifywatch и inotifywait. Эти утилиты как раз и помогут нам обеспечить необходимый функционал отслеживания изменений файловой системы. Для начала нужно установить пакет inotify-tools твоим менеджером пакетов

pacman -S inotify-tools

apt install inotify-tools

Далее рассмотрим подробнее вышенаписанные утилиты.

Принцип работы inotifywatch

Утилита inotifywatch собирает статистику доступа к файловой системе при помощи inotify. После окончания своей работы, эта программа выводит статистическую информацию в табличном виде, включающем в себя информацию об общем количестве событий, о количестве событий каждого типа и файле, для которого произошло событие. У неё есть ряд параметров, которые можно использовать для изменения параметров работы.

Вывод информации по использованию

Выводить дополнительную информацию на стандартный поток ошибок во время работы

Отслеживать изменения рекурсивно для директории, переданной в качестве аргумента командной строки. Если внутри отслеживаемой директории будут созданы поддиректории во время работы программы, они автоматически будут отслеживаться. Если для отслеживания выбрана корневая директория или директория с большим количеством поддиректорий и файлов, установка отслеживания всех элементов файловой системы может занять некоторое время, в течение которого события получены не будут. Кроме того, возможно достижение максимального количества объектов файловой системы, разрешенных для отслеживания каждому пользователю. Значение по умолчанию 8192, и оно может быть увеличено записью нового значения в /proc/sys/fs/inotify/max_user_watches:

echo "25600" > /proc/sys/fs/inotify/max_user_watches

Исключить из отслеживания файлы с именами, совпадающими с шаблоном. Для шаблона используются расширенные регулярные выражения POSIX. Регистр при использовании данного параметра учитывается .

Исключить из отслеживания файлы с именами, совпадающими с шаблоном. Для шаблона используются расширенные регулярные выражения POSIX. Регистр при использовании данного параметра игнорируется .

Во время рекурсивного слежения за директорией исключить указанный файл из отслеживания. Если для файла указаны одновременно включение в список для отслеживания и исключение из отслеживания, он будет отслеживаться. Для файла можно использовать как относительный путь, так и абсолютный. Если имя файла включает символ «@», используйте абсолютный путь.

Читать список файлов, которые будут отслеживаться и игнорироваться, из файла, каждое имя файла должно начинаться с новой строки. Если имя файла начинается с символа «@», отслеживание для него будет отключено. Если в качестве имени файла указать символ «-» (минус), то список файлов будет считываться со стандартного потока ввода. Этот параметр имеет смысл использовать, когда нужно отслеживать большое количество файлов, и их список неудобно передавать как аргументы командной строки.

Выводить колонки и строки таблицы даже в том случае, когда они пусты. По умолчанию пустые строки и колонки не выводятся.

Работать только в течение указанного количества секунд. Если этот параметр не указан, программа будет работать до получения сигнала на прерывание работы, например, по нажатию клавиш Ctrl+C

Отслеживать только события указанных типов. Этот параметр может быть указан более одного раза. Если он не указан, будут отслеживаться события всех типов

Сортировать вывод по возрастанию количества событий для указанного типа событий. Типы событий, по которым можно осуществлять сортировку, включают «total» и события, которые перечислены ниже, за исключением «move» и «close» (вместо них нужно указывать «moved_to», «moved_from», «close_write» и «close_nowrite»). По умолчанию сортировка производится по убыванию по полю «total».

Сортировать вывод по уменьшению количества событий для указанного типа событий. Типы событий, по которым можно осуществлять сортировку, включают «total» и события, которые перечислены ниже, за исключением «move» и «close» (вместо них нужно указывать «moved_to», «moved_from», «close_write» и «close_nowrite»). По умолчанию сортировка производится по убыванию по полю «total».

Типы событий для отслеживания

Отслеживаемый файл или файл в отслеживаемой директории был прочитан

Отслеживаемый файл или файл в отслеживаемой директории был записан

Метаданные отслеживаемого файла или файла в отслеживаемой директории были изменены. Сюда включаются изменения времени доступа и изменения, права доступа, расширенные атрибуты и так далее.

Отслеживаемый файл или файл в отслеживаемой директории был закрыт после открытия его в режиме записи. Это не говорит о том, что в файл были записаны какие-то данные.

Отслеживаемый файл или файл в отслеживаемой директории был закрыт после открытия в режиме только для чтения

Отслеживаемый файл или файл в отслеживаемой директории был закрыт, при этом неважно, в каком режиме он был открыт. Имейте в виду, что это событие рализовано просто прослушиванием обоих событий close_write и close_nowrite, поэтому все события будут выведены именно как одно из них, а не как CLOSE. Этот тип скорее как сокращение для двух других типов событий

Отслеживаемый файл или файл в отслежваемой директории был открыт

Файл или директория были перемещены в отслеживаемую директорию. Это событие возникает даже в том случае, когда файл был перемещен в пределах одной и той же директории

Файл или директория были перемещены из отслеживаемой директории. Это событие возникает даже в том случае, когда файл был перемещен в пределах одной и той же директории

Файл или директория были перемещены из отслеживаемой директории или в неё. Это событие реализовано аналогично событию CLOSE, то есть, скорее как псевдоним для двух типов событий, moved_to и moved_from,поэтому все события будут выведены именно как одно из них, а не как MOVE

Отслеживаемый файл или директорию были перемещены. После возникновения этого события файл или директория больше не отслеживается.

Файл или директория были созданы в отслеживаемой директории

Файл или директория были удалены из отслеживаемой директории

Отслеживаемый файл или директория были удалены. После этого события файл или директория больше не отслеживается. Обратите внимание, что это событие может произойти, даже если оно явно не слушалось.

Файловая система, накоторой находится отслеживаемый файл или директория, была отмонтирована. Поле возникновения этого события файл или директория перестает отслеживаться.Обратите внимание, что это событие может произойти, даже если оно явно не слушалось.

Пример работы утилиты inotifywatch:

inotifywatch -r -t 300 /var/log
Establishing watches.
Finished establishing watches, now collecting statistics.
total access modify close_nowrite open filename
5 2 1 1 1 /var/log/journal/85e95bc6a51b4c229936701734a5d6b1/
4 2 0 1 1 /var/log/journal/

Принцип работы inotifywait

Утилита inotifywait работает иначе. Она ждет возникновения события и выводит информацию об этом событии сразу, не дожидаясь сигнала прерывания.

Вывод информации по использованию

Отслеживать изменения рекурсивно для директории, переданной в качестве аргумента командной строки. Если внутри отслеживаемой директории будут созданы поддиректории во время работы программы, они автоматически будут отслеживаться. Если для отслеживания выбрана корневая директория или директория с большим количеством поддиректорий и файлов, установка отслеживания всех элементов файловой системы может занять некоторое время, в течение которого события получены не будут. Кроме того, возможно достижение максимального количества объектов файловой системы, разрешенных для отслеживания каждому пользователю. Значение по умолчанию 8192, и оно может быть увеличено записью нового значения в /proc/sys/fs/inotify/max_user_watches:

echo "25600" > /proc/sys/fs/inotify/max_user_watches

Исключить из отслеживания файлы с именами, совпадающими с шаблоном. Для шаблона используются расширенные регулярные выражения POSIX. Регистр при использовании данного параметра учитывается .

Исключить из отслеживания файлы с именами, совпадающими с шаблоном. Для шаблона используются расширенные регулярные выражения POSIX. Регистр при использовании данного параметра игнорируется .

Во время рекурсивного слежения за директорией исключить указанный файл из отслеживания. Если для файла указаны одновременно включение в список для отслеживания и исключение из отслеживания, он будет отслеживаться. Для файла можно использовать как относительный путь, так и абсолютный. Если имя файла включает символ «@», используйте абсолютный путь.

Читать список файлов, которые будут отслеживаться и игнорироваться, из файла, каждое имя файла должно начинаться с новой строки. Если имя файла начинается с символа «@», отслеживание для него будет отключено. Если в качестве имени файла указать символ «-» (минус), то список файлов будет считываться со стандартного потока ввода. Этот параметр имеет смысл использовать, когда нужно отслеживать большое количество файлов, и их список неудобно передавать как аргументы командной строки.

Работать только в течение указанного количества секунд. Если этот параметр не указан, программа будет работать до получения сигнала на прерывание работы, например, по нажатию клавиш Ctrl+C

Отслеживать только события указанных типов. Этот параметр может быть указан более одного раза. Если он не указан, будут отслеживаться события всех типов

Выполняться постоянно. По умолчанию программа завершает свою работу после появления первого события

Выводить события в файл вместо стандартного потока вывода

Выводить ошибки в системный модуль syslog вместо вывода в стандартный поток ошибок

То же самое, что и --monitor, но запись событий производится в файл, указанный в параметре --output. Вывод ошибок производится так же, как при использовании параметра --syslog

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

Вывод в формате CSV (comma-separated values). Такой формат вывода удобно использовать в тех случаях, когда имена файлов могут содержать пробелы, потому что в таком случае разбивать информацию на поля по пробелам небезопасно.

Вывод в формате, определенном пользователем, с использованием синтаксиса, похожего на тот, который использует printf. Длина строки вывода информации о событии ограничена примерно 4000 символов и строки будут укорочены до этой длины. Поддерживаются следующие шаблоны:
1) %w -- Этот шаблон будет заменен именем отслеживаемого файла, для которого произошло событие
2) %f -- Когда событие возникает при отслеживании директории, этот шаблон будет заменен именем файла, для которого произошло событие. В противном случае он будет заменен пустой строкой.
3) %e -- Этот шаблон заменяется событием или событиями, разделенными запятыми, которые произошли.
4) %Xe -- Заменяется событиями, которые возникли, разделенными символом, который в данном шаблоне будет стоять на месте «X».
5) %T -- Заменяется текущим временем в формате, определенным параметром --timefmt, который должен быть задан в видее, подходящем для передачи функции strftime.

Установить формат вывода даты и времени в виде, подходящем для передачи функции strftime для использования совместно с шаблоном «%T» параметра «--format». Более подробно формат строки шаблона даты и времени можно посмотреть командой «man 3 strftime»

Пример работы утилиты inotifywait:

inotifywait /var/log
Setting up watches.
Watches established.
/var/log/ OPEN,ISDIR

Напишем полезный скрипт для использования подсистемы inotify

Итак, я покажу, как написать скрипт для бекапа измененных и созданных файлов в определенную директорию.

В принципе, в скрипте все описано, и он успешно копирует измененные и созданные файлы из директории /srv/web/files в /mnt/backup

Читайте также: