🐧 Как отслеживать события файловой системы в файлах и каталогах на Linux |

🐧 Как отслеживать события файловой системы в файлах и каталогах на Linux

Мануал

Inode notify (inotify) – это подсистема Linux kenel, которая предоставляет API для мониторинга событий файловой системы.

Помимо взаимодействия с такими API из соответствующих языков программирования, можно воспользоваться преимуществами открытых функций, используя некоторые специально разработанные инструменты командной строки, такие как inotifywait, которые могут быть легко установлены во всех основных дистрибутивах Linux.

Установка

Утилита командной строки inotifywait является частью пакета inotify-tools, который доступен в официальных репозиториях всех основных дистрибутивов Linux.

Для установки пакета в Fedora и дистрибутивах на базе Fedora выполните команду:

sudo dnf install inotify-tools

Чтобы установить его на Debian и производные, вместо этого мы можем использовать следующую команду:

sudo apt install inotify-tools

Пакет также доступен в репозитории “Extra” Archilinux.

Мы можем использовать менеджер пакетов pacman для выполнения установки:

sudo pacman -Sy inotify-tools

Мониторинг событий файловой системы

Утилита inotifywait может использоваться для ожидания и реагирования на события в файловой системе.

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

В примере ниже мы используем файл ~/.bash_profile в качестве примера:

inotifywait ~/.bash_profile
Setting up watches.
Watches established.[simterm]
Когда инструмент выполняется так, как мы сделали выше, он устанавливает наблюдение за указанным файлом и существует, когда происходит первое событие.
В качестве примера попробуем прочитать содержимое файла:
[simterm] $ cat ~/.bash_profile

Как только мы запускаем команду из другого окна терминала, мы получаем уведомление о событии “OPEN” и inotify выходит из программы:

/home/doc/.bash_profile OPEN

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

Чтобы изменить это поведение и отслеживать все дерево каталогов, достаточно использовать опцию -r (–recursive).

При запуске утилиты таким образом нам может потребоваться увеличить максимальное количество разрешенных часов, что можно сделать, записав соответствующее значение в файл /proc/sys/fs/inotify/max_user_watches.

Обратите внимание, однако, что изменения в этом файле не сохраняются при перезагрузке.

Прослушивание определенного события

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

В таких случаях мы можем просто использовать опцию -e (сокращение от –event) и передать в качестве аргумента одно из поддерживаемых EVENTS.

Придерживаясь предыдущего примера, чтобы отслеживать только события “модификации” в файле ~/.bash_profile, мы должны выполнить следующее:

inotifywait -e modify ~/.bash_profile

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

echo "# This is just a comment" >> ~/.bash_profile

Событие уведомляется, как и ожидалось:

/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 -m ~/.bash_profile
Setting up watches.
Watches established.
/home/doc/.bash_profile OPEN
/home/doc/.bash_profile ACCESS
/home/doc/.bash_profile CLOSE_NOWRITE,CLOSE
/home/doc/.bash_profile OPEN
/home/doc/.bash_profile MODIFY
/home/doc/.bash_profile CLOSE_WRITE,CLOSE

Исключение файлов из мониторинга

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

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

Для выполнения этих задач мы можем использовать опции –exclude и –include соответственно.

Обе они принимают в качестве аргумента регулярное выражение POSIX.

В следующем примере мы отслеживаем все файлы в каталоге ~/.config, кроме тех, которые имеют расширение “.xml”:

inotifywait -m ~/.config --exclude ".*.xml"

Опции –include и –exclude соответствуют переданным выражениям в режиме чувствительности к регистру; однако у обеих есть вариант, который работает в режиме нечувствительности к регистру: –includei и –excludei, соответственно.

Заключение

В этом руководстве мы узнали, как установить пакет inotify-tools на некоторые из наиболее используемых дистрибутивов Linux, и как использовать утилиту командной строки inotifywait для мониторинга событий, происходящих с файлами и каталогами.

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий