Найти тему
programmer's notes (python and more)

Программирование на языке python. Отслеживание событий файловой системы. Статья 1, модуль inotify

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Некоторые полезные библиотеки для Python | programmer's notes (python and more) | Дзен
Python, управление файлами | programmer's notes (python and more) | Дзен
Базовый курс программирования на Python | programmer's notes (python and more) | Дзен

Пример использования модуля inotify для отслеживания событий в файловой системе

Решил написать две статьи на тему об отслеживании событий в событий файловой системы. Мне кажется это интересная тема.

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

В операционных системах Linux есть подсистема ядра операционной системы Inotify. Именно эта подсистема позволяет отслеживать события файловой системы. В Unix-подобных операционных системах есть целый набор системных вызовов, доступ к которым и позволяет следить за тем, что делается с файлами. Но, а мы здесь на канале занимаемся языком python и поэтому должны искать нужные библиотеки. И они есть у нас.

Для python есть библиотека inotify, которая позволяет отслеживать события файловой системы путём проверки содержимого некоторого итератора. Так что отслеживание предполагает постоянный опрос некоторого объекта (event_gen()).

Приведу пример простой программы, которая отслеживает два события: запись в файл и создание файла-каталога в заданном каталоге. Программа ждёт событий и выдаёт сообщение о них. Через 60 секунд программа автоматически заканчивает работу.

Скриншот программы отслеживания событий  файловой системы. Текст программы см. ниже по ссылке
Скриншот программы отслеживания событий файловой системы. Текст программы см. ниже по ссылке
primer319.py

Приведу пример работы программы. Отмечу, что программа отслеживает события в каталоге ./primer, который создан в текущем каталоге.

Создание файла или каталога Путь:./primer Файл:tty
Создание файла или каталога Путь:./primer Файл:text.txt
Запись в файл Путь:./primer Файл:text.txt

Программа отметила создание каталога tty (одна запись), создание текстового файла (две записи). В последнем случае отмечается два события: создание файла и запись данных в этот файл.

Дадим некоторые пояснения к программе

  • Прежде всего отмечу механизм окончания работы программы через 60 секунда (timeout = 60). Механизм использует библиотеку threading (на канале есть статья). С помощью этой библиотеки создаётся таймер, срабатывающий через заданное время и запускающий заданную функцию. В функции меняется значение глобальной переменной. В цикле ниже это значение проверяется и если оно изменилось происходит выход из цикла.
  • Проверка событий в каталоге осуществляется через созданный объект inotify.adapters.Inotify(). После создания объекта добавляется каталог наблюдения: fl.add_watch('./primer').
  • Проверка события осуществляется проверкой итератора fl.event_gen(). Если результат не пустой, то возвращается четвёрка данных, которые описывают события. Конечно, чтобы правильно обрабатывать события придётся внимательно изучить значения данных при разных действиях над файлами. При одном действии может быть сгенерировано несколько событий. Я привожу примеры только для двух типов действий: создание и запись ('IN_CLOSE_WRITE', 'IN_CREATE'). Причём создание предполагает создание и файла и каталога.
  • Подчеркнём ещё раз, что для корректной обработки придётся изучить все генерируемые события и выработать алгоритм определения, того, что произошло. Но есть и хорошая новость. Можно отслеживать множество каталогов. Кстати, для вложенных каталогов нужно создавать своё наблюдение для каждого.

Замечание важное
Совсем забыл отметить, зачем я проверяю '#' в имени файла. Это чисто мои заморочки. Для проверки работы программы я открываю еще один терминал и использую для создания и редактирования текстовых файлов редактор программы midnight commander. А этот редактор использует вспомогательный файл с тем же именем, что созданный, но первым символом идёт '#'. Но нужно иметь в виду, что и другие программы могут создавать временные файлы и это нужно учитывать. Так что эту проверку можно спокойно удалять и подстраивать программу под свои условия.

Ну, пока всё!

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

Будьте внимательны, я за вами слежу
Будьте внимательны, я за вами слежу