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.