В некоторых случаях, особенно в критических и ограниченных местах файловой системы, может быть полезно знать, когда что-то изменилось и что изменилось. Используя инструменты Linux Inotify и Python, мы можем просматривать и регистрировать изменения, происходящие в системе.
В этом руководстве будет рассмотрено, как реализовать простой скрипт, который использует Python и Linux Inotify API для отслеживания изменений в определенном каталоге и регистрации изменений консоли.
Прежде чем мы перейдем к сценарию, давайте кратко обсудим, как работает Inotify.
Что такое Inotify? Как это работает?
Inotify – это подсистема ядра, которая предоставляет механизм для отслеживания событий в файловой системе и сообщения о них различным приложениям, которым они необходимы. Inotify невероятно мощный, потому что он работает на нижних уровнях ядра и настраивается для расширения функциональности. Inotify может отслеживать изменения в каталогах и отдельных файлах.
Хотя Inotify мощный, у него есть некоторые ограничения. Эти ограничения включают:
- Inotify не поддерживает рекурсивный просмотр каталогов
- Доступно только в ядре Linux.
- Переименование событий с помощью Inotify напрямую не рассматривается.
Однако Inotify по-прежнему является гораздо лучшим выбором, чем его предшественник Dnotify. Inotify широко применяется в приложениях безопасности, таких как антивирусы.
Теперь, когда у нас есть базовая теория Inotify, давайте перейдем к созданию сценария, который поможет нам отслеживать изменения в каталогах.
Установка Python и Watchdog
Прежде чем погрузиться в код, давайте установим несколько требований, таких как установка Python и пакета watchdog.
Чтобы установить Python3 в Debian, используйте команду apt как:
sudo apt-get update sudo apt-get install python3.7 python3-pip -y
Чтобы установить пакет watchdog, используйте команду pip3, как показано ниже:
https://pypi.org/project/watchdog/ sudo pip3 install watchdog
Написание сценария
Скрипт, который мы создадим в этом уроке, очень прост. Рассмотрим исходный код, показанный ниже:
import sys import logging import time from watchdog.events import LoggingEventHandler from watchdog.observers import Observer def monitor(): # Добавить базовую конфигурацию logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S") # Получить каталог в качестве аргумента path = sys.argv[1] if len(sys.argv) > 1 else '.' e_handler = LoggingEventHandler() watch = Observer() watch.schedule(e_handler, path, recursive=True) watch.start() try: while True: time.sleep(2) except KeyboardInterrupt: watch.stop() watch.join() monitor()
Начнем с импорта необходимых модулей, включая сторожевой таймер. Затем мы создаем простую функцию монитора и устанавливаем конфигурацию, такую как формат вывода и дату. Затем мы устанавливаем аргументы пути к каталогу.
Затем мы переходим к созданию объекта Observer и настраиваем его для рекурсивного отслеживания изменений в указанном каталоге, если не встречается прерывание клавиатуры (CTRL + C)
Наконец, мы вызываем функцию и запускаем скрипт.
Заключение
Используя эту статью, мы создали простой скрипт, который отслеживает изменения в каталоге и постоянно записывает их в консоль.