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

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019