ADMIN-Tipp: Dateiänderungen überwachen

Jede Woche erscheint in unserem Newsletter ein neuer ADMIN-Tipp. Eine Sammlung aller Tipps finden Sie im Archiv der ADMIN-Tipps.

Die Inotify-Schnittstelle des Linux-Kernels erlaubt es, Dateien und Verzeichnisse im Blick zu behalten. Mit der Python-API lassen sich dafür eigene Skripte schreiben.

Die unendliche Schleife hat schon lange ausgedient. Wer heute Dateien und Verzeichnisse auf Änderungen hin überwachen möchte, kann die Inotify-Schnittstelle des Linux-Kernels verwenden. Darüber registriert man sich für bestimmte Dateioperationen, bei denen der Kernel dann eine Benachrichtigung verschickt. Von der Lowlevel-Schnittstelle können Programmierer mit der Programmiersprache C Gebrauch machen. Eine etwas einfachere API, zusammen mit einigen Command Line Tools bietet das Projekt "inotify-tools", auf dem wiederum "pyinotify" aufbaut, das die gleiche Funktionalität für Python-Skripte anbietet.

Pyinotify implementiert einige Klassen, mit denen sich in wenigen Zeilen Dateien und Verzeichnisse per Inotify überwachen lassen. Zuerst erzeugt man ein "WatchManager"-Objekt und einen "EventHandler," die man über einen "Notifier" verbindet. Dem "WatchManager" fügt die Methode "add_watch" einen neuen Überwachungsausdruck (Watch) hinzu, der im Wesentlichen aus dem Pfad und einer Maske von Dateioperationen besteht.

wm = pyinotify.WatchManager()
mask = pyinotify.IN_CLOSE_WRITE  | pyinotify.IN_CREATE
handler = EventHandler()
notifier = pyinotify.Notifier(wm, handler)
wdd = wm.add_watch(path, mask, rec=True, auto_add=True)

Die folgende Zeile startet dann die Schleife zur Verarbeitung der Inotify-Events:

notifier.loop()

Den Event-Handler muss der Anwender nach einem vorgegebenen Muster selber schreiben. Wichtig sind hierbei die Namen der Methoden, die die Klasse besitzt. Im obigen Codeabschnitt selektiert die Maske etwa die "CLOSE_WRITE"-Events, also muss die "EventHandler"-Klasse die Methode "process_IN_CLOSE_WRITE" enthalten:

class EventHandler(pyinotify.ProcessEvent):
    def process_IN_CLOSE_WRITE(self, event):
         print "Datei erzeugt oder geaendert"

Eine Besonderheit dieses Beispiels liegt darin, dass es automatisch auch neu hinzugefügte Unterverzeichnisse überwacht. Dazu dienen die beiden Parameter "rec=True, auto_add=True" des "add_watch"-Aufrufs. Damit das funktioniert, muss die Maske aber auch "pyinotify.IN_CREATE" einschließen, weil sonst die Create-Events gar nicht beachtet werden. Wenn die neu angelegten Dateien verarbeitet werden sollen, eignet sich "IN_CREATE" übrigens nicht besonders gut, weil das Event schon zu Beginn des Neuanlegens erzeugt wird. Deshalb verwendet das hier gezeigte Beispiel für diesen Zweck das "IN_CLOSE_WRITE"-Event.

Mehr Informationen, die API-Dokumentation und die verfügbaren Events sind im Pyinotify-Wiki zu finden.

21.05.2013

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Systeme mit Vamigru verwalten

Auch wer nur kleine Flotten von Linux-Servern verwaltet, freut sich über Werkzeuge, die ihm diese Arbeit erleichtern. Vamigru tritt mit diesem Versprechen an. Wir verraten, was es leistet und wie Sie es in der eigenen Umgebung in Betrieb nehmen. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Container

Wie setzen Sie Container ein?

  • Gar nicht
  • Docker standalone
  • Docker mit Kubernetes
  • Docker mit Swarm
  • Docker mit anderem Management
  • LXC/LXD
  • Rocket
  • CRI-O auf Kubernetes
  • Container auf vSphere
  • Andere (siehe Kommentare auf der Ergebnisseite)

Google+

Ausgabe /2018

Microsite