Inotify

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]:

  • iwatch — записывает событие в лог-файл, посылает уведомление по электронной почте,
  • inoticoming — для выполнения некоторых действий при активности в целевом каталоге,
  • incron — демон, подобный cron, но работающий на основе событий файловой системы,
  • inosync и lsyncd — утилиты для синхронизации каталогов в реальном времени,
  • Начиная с версии 7.5, GNU tail включает поддержку Inotify при использовании опции -f (до этого была утилита inotail).

Системные вызовы

[править | править код]

Для работы с функциями нужно подключить заголовочный файл 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 имя файла относительно каталога, для которого был создан дескриптор наблюдения

Маска события является логическим ИЛИ следующих констант:

  • IN_ACCESS — К файлу было произведено обращение (чтение)
  • IN_ATTRIB — Были изменены метаданные (права доступа, временные метки, расширенные атрибуты и т. п.)
  • IN_CLOSE_WRITE — Файл, открывавшийся для записи, был закрыт
  • IN_CLOSE_NOWRITE — Файл, открывавшийся не для записи, был закрыт
  • IN_CREATE — Файл/каталог был создан в наблюдаемом каталоге
  • IN_DELETE — Файл/каталог был удален в наблюдаемом каталоге
  • IN_DELETE_SELF — Наблюдаемый файл/каталог был удален
  • IN_MODIFY — Файл был изменён
  • IN_MOVE_SELF — Наблюдаемый файл/каталог был перемещён
  • IN_MOVED_FROM — Файл/каталог был перемещён из наблюдаемого каталога
  • IN_MOVED_TO — Файл/каталог был перемещён в наблюдаемый каталог
  • IN_OPEN — Файл/каталог был открыт

При генерации событий также могут быть использованы следующие константы:

  • IN_IGNORED — Наблюдение было снято либо вручную (inotify_rm_watch) либо автоматически (файловая система была размонтирована)
  • IN_ISDIR — Объектом события является каталог
  • IN_Q_OVERFLOW — Произошло переполнение очереди событий
  • IN_UNMOUNT — Файловая система, содержащая объект наблюдения, была размонтирована

Примечания

[править | править код]
  1. 1 2 3 4 5 6 7 Vervloesem, 2011.
  2. Inotify-tools Архивная копия от 1 июня 2014 на Wayback Machine is a C library and a set of command-line programs for Linux providing a simple interface to inotify

Литература

[править | править код]
  • Koen Vervloesem. Inotify: Watch your filesystem // Linux format. — 2011. — № LXF140. — ISSN 1470-4234.