Inode notify (inotify) – это подсистема Linux kenel, которая предоставляет API для мониторинга событий файловой системы.
Помимо взаимодействия с такими API из соответствующих языков программирования, можно воспользоваться преимуществами открытых функций, используя некоторые специально разработанные инструменты командной строки, такие как inotifywait, которые могут быть легко установлены во всех основных дистрибутивах Linux.
Установка
Утилита командной строки inotifywait является частью пакета inotify-tools, который доступен в официальных репозиториях всех основных дистрибутивов Linux.
Для установки пакета в Fedora и дистрибутивах на базе Fedora выполните команду:
Чтобы установить его на Debian и производные, вместо этого мы можем использовать следующую команду:
Пакет также доступен в репозитории “Extra” Archilinux.
Мы можем использовать менеджер пакетов pacman для выполнения установки:
Мониторинг событий файловой системы
Утилита inotifywait может использоваться для ожидания и реагирования на события в файловой системе.
В самом простом варианте использования мы вызываем утилиту и передаем в качестве аргумента путь к файлу или каталогу, который мы хотим отслеживать.
В примере ниже мы используем файл ~/.bash_profile в качестве примера:
Как только мы запускаем команду из другого окна терминала, мы получаем уведомление о событии “OPEN” и inotify выходит из программы:
/home/doc/.bash_profile OPEN
Если в качестве аргумента команды передать путь к каталогу, то будут отслеживаться все файлы внутри этого каталога, но не содержимое подкаталогов, так как по умолчанию команда не является рекурсивной.
Чтобы изменить это поведение и отслеживать все дерево каталогов, достаточно использовать опцию -r (–recursive).
При запуске утилиты таким образом нам может потребоваться увеличить максимальное количество разрешенных часов, что можно сделать, записав соответствующее значение в файл /proc/sys/fs/inotify/max_user_watches.
Обратите внимание, однако, что изменения в этом файле не сохраняются при перезагрузке.
Прослушивание определенного события
В некоторых ситуациях мы можем захотеть получать уведомления только при наступлении определенного события в файле.
В таких случаях мы можем просто использовать опцию -e (сокращение от –event) и передать в качестве аргумента одно из поддерживаемых EVENTS.
Придерживаясь предыдущего примера, чтобы отслеживать только события “модификации” в файле ~/.bash_profile, мы должны выполнить следующее:
Поскольку мы слушаем только событие “modify”,то есть на изменения команда будет продолжать выполняться, если мы читаем содержимое файла, но уведомит нас, как только мы попытаемся записать в него, например, просто добавить содержимое:
Событие уведомляется, как и ожидалось:
/home/doc/.bash_profile MODIFY
События, которые мы можем прослушивать, представлены в следующей таблице, как описано в руководстве по эксплуатации:
Событие | Описание |
---|---|
access | Произошло чтение наблюдаемого файла или файла в наблюдаемом каталоге. |
modify | В наблюдаемый файл или файл в наблюдаемом каталоге была произведена запись. |
attrib | Метаданные наблюдаемого файла или файла в наблюдаемом каталоге были изменены. Сюда входят временные метки, разрешения файла, расширенные атрибуты и т.д. |
close_write | Наблюдаемый файл или файл в наблюдаемом каталоге был закрыт после открытия в режиме записи. Это не обязательно означает, что в файл была произведена запись. |
close_nowrite | Наблюдаемый файл или файл в наблюдаемом каталоге был закрыт, после того как был открыт в режиме только для чтения. |
close | Наблюдаемый файл или файл в наблюдаемом каталоге был закрыт, независимо от того, как он был открыт. Обратите внимание, что на самом деле это реализовано путем прослушивания событий close_write и close_nowrite, поэтому все полученные события закрытия будут выводиться как одно из этих событий. |
open | Был открыт наблюдаемый файл или файл в наблюдаемом каталоге. |
moved_to | Файл или каталог был перемещен в наблюдаемый каталог. Это событие происходит, даже если файл просто перемещается из и в тот же каталог. |
moved_from | Файл или каталог был перемещен из наблюдаемого каталога. Это событие происходит, даже если файл просто перемещается из и в тот же каталог. |
move | Файл или каталог был перемещен из или в просматриваемый каталог. Обратите внимание, что на самом деле это реализовано путем прослушивания событий moved_to и moved_from, поэтому все полученные события закрытия будут выводиться как одно из них или оба, а не MOVE. |
move_self | Наблюдаемый файл или каталог был перемещен. После этого события за файлом или каталогом больше не следят. |
create | Файл или каталог был создан внутри наблюдаемого каталога. |
delete | Был удален файл или каталог в наблюдаемом каталоге. |
delete_self | Наблюдаемый файл или каталог был удален. После этого события за файлом или каталогом больше не следят. Обратите внимание, что это событие может произойти, даже если оно явно не прослушивается. |
unmount | Файловая система, на которой находится наблюдаемый файл или каталог, была размонтирована. После этого события за файлом или каталогом больше не следят. Обратите внимание, что это событие может произойти, даже если его явно не прослушивают. |
Прослушивание в режиме “monitor”
Если мы хотим, чтобы команда продолжала прослушивать события, мы можем просто использовать опцию -m, которая является сокращением от –monitor.
В следующем примере мы устанавливаем наблюдение за целевым файлом в режиме мониторинга, затем сначала читаем его содержимое, затем добавляем к нему некоторое содержимое.
Каждая операция включает три события, все из которых регистрируются:
Исключение файлов из мониторинга
Как мы уже говорили, утилиту inotifywait можно использовать для прослушивания событий о файлах внутри указанного каталога или всего дерева каталогов.
В таких ситуациях мы можем захотеть избежать мониторинга определенных файлов или явно включить некоторые из них.
Для выполнения этих задач мы можем использовать опции –exclude и –include соответственно.
Обе они принимают в качестве аргумента регулярное выражение POSIX.
В следующем примере мы отслеживаем все файлы в каталоге ~/.config, кроме тех, которые имеют расширение “.xml”:
Опции –include и –exclude соответствуют переданным выражениям в режиме чувствительности к регистру; однако у обеих есть вариант, который работает в режиме нечувствительности к регистру: –includei и –excludei, соответственно.
Заключение
В этом руководстве мы узнали, как установить пакет inotify-tools на некоторые из наиболее используемых дистрибутивов Linux, и как использовать утилиту командной строки inotifywait для мониторинга событий, происходящих с файлами и каталогами.