Inotify — это подсистема ядра Linux, которая позволяет получать уведомления о событиях, связанных с файлами и каталогами файловой системы. Например, открытие файлов и каталогов для чтения или записи, изменения атрибутов, перемещение, удаление и т. п. В основное ядро была включена начиная с 2.6.13, но может использоваться и с более ранними ядрами с помощью наложения патча. Начиная с 2.6.32 Inotify был заменен на Fsnotify, а Inotify реализован на основе Fsnotify, но для практических приложений эта деталь осталась несущественной[1].
С помощью подписки на события Inotify скриптам необязательно периодически сканировать файловую систему для обнаружения изменений. Более того, подписка на события не мешает размонтированию тома[1].
Основная сфера применения — в системах локального поиска (например Beagle), таким образом программе-индексатору не требуется периодически сканировать всю файловую систему. Кроме того, можно следить за важными конфигурационными файлами и восстанавливать их в случае повреждения, выполнять автоматические действия после загрузки файлов на сервер и т. п.[1]
Хотя механизм Inotify является частью операционной системы, доступной через набор системных вызовов, и потому не требует установки дополнительных библиотек, для командной строки создан пакет inotify-tools, позволяющий использовать Inotify в скриптах[1][2].
Двумя основными утилитами inotify-tools являются inotifywatch и inotifywait, например, следующая команда собирает статистику использования каталога /tmp[1]:
inotifywatch -r /tmp
Для слежения за файлами или каталогами в реальном времени можно применить inotifywait[1]:
$ inotifywait -mr /tmp Setting up watches. Beware: since -r was given, this may take a while! Watches established. /tmp/ CREATE example-tmp-file /tmp/ OPEN example-tmp-file /tmp/ CLOSE_WRITE,CLOSE example-tmp-file
Примерами других утилит, использующих Inotify, являются[1]:
Для работы с функциями нужно подключить заголовочный файл sys/inotify.h.
int inotify_init()
Создает файловый дескриптор, из которого читаются все происходящие события.
int inotify_add_watch(int fd, const char * path, __u32 mask);
Создает уникальный (внутри файлового дескриптора) дескриптор наблюдения (watch descriptor), который используется для отождествления путей и происходящих событий. При этом, допускаются только те события, которые указаны в маске.
int inotify_rm_watch(int fd, __u32 wd);
Удаляет существующий дескриптор наблюдения.
События получаются с помощью традиционного системного вызова read, который читает в структуру inotify_event со следующими полями:
Идентификатор | Значение |
---|---|
wd | дескриптор наблюдения |
mask | маска событий |
cookie | метка синхронизации между IN_MOVED_FROM и IN_MOVED_TO |
len | длина имени файла |
name | имя файла относительно каталога, для которого был создан дескриптор наблюдения |
Маска события является логическим ИЛИ следующих констант:
При генерации событий также могут быть использованы следующие константы: