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

Support-Ende von SMBv1

Mit dem aktuellen Update für Windows 10 und Windows Server 2016 steht eine Änderung ins Haus, die gerade für Benutzer älterer Linux-Distributionen große Auswirkungen hat. Nachdem Microsoft es über viele Jahre schon angekündigt hat, entfernt der Konzern mit dem aktuellen Update-Release den Support für das SMB-Protokoll 1. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Linux-Backup

Welche Backup-Lösung setzen Sie für Linux im professionellen Umfeld ein?

  • keine
  • eigene Scripts
  • rsnapshot
  • rdiff-backup
  • Bacula
  • Bareos
  • Borg
  • Duplicity
  • Amanda
  • Burp
  • Clonezilla
  • Acronis
  • Arkeia
  • SEP sesam
  • Veeam
  • Redo Backup
  • Relax-and-Recover
  • andere kommerzielle Software
  • andere Open-Source-Software

Google+

Ausgabe /2018

Microsite