Aus LinuxUser 01/2017

Mit Inotify das Dateisystem überwachen

© Dmitry Guzhanin, 123RF

Bescheid!

Das Dateisystem auf Veränderungen zu überwachen, erweist sich oft als ausgesprochen nützlich, hilft es doch, viele Vorgänge zu automatisieren.

Die Situation tritt immer wieder auf: Sobald Sie eine bestimmte Datei erzeugt oder verändert haben, möchten Sie das Kompilieren anstoßen, ein Archiv erstellen oder das File auf einen Server hochladen. Früher kam dazu das sogenannte Busy-Waiting zum Einsatz, heute erledigen die Inotify-Tools diese Aufgabe eleganter und effizienter [1].

Beim Busy-Waiting läuft ein Programm in einer Endlosschleife und ruft dabei immer wieder dieselben Informationen ab, etwa den Inhalt eines Verzeichnisses. Diese vergleicht es mit zuvor erhobenen Daten. Diese Vorgehensweise ist nicht nur ineffektiv, sondern kann im schlimmsten Fall bei Datenträgern sogar Schäden verursachen.

Viel besser wäre es, liefe die Überwachung automatisch ab – der Kernel könnte alle Programme, die auf eine Änderung an einer Datei warten, über eine spezielle Schnittstelle benachrichtigen. Schon die Dateisysteme des Amiga kannten so etwas. Tatsächlich gibt es auch unter Linux eine entsprechende Funktion namens Inotify (aus „I-Node“ und „notify“). Linux setzt Inotify auf bestimmte Einträge im Dateisystem an.

Durch Optionen legen Sie dabei fest, welche Änderungen an Dateien der Kernel auf welche Weise meldet. Alle Änderungen lösen sogenannte Events aus, einen Überblick dazu finden Sie in der Tabelle „Inotify-Events“. Achtung: Die tatsächlich verwendete Syntax unterscheidet sich bei den Programmen gelegentlich, oft hinsichtlich der Groß/Kleinschreibung. Bei Fehlern finden Sie meist in der Manpage des verwendeten Programms Hinweise. Bei den SELF-Events existieren die beobachteten Dateien nach der Meldung nicht mehr, was normalerweise die Überwachung beendet.

Inotify-Events

Kürzel Format
ACCESS Zugriff auf die Datei(en)
ATTRIB Metadaten geändert
CLOSE_WRITE Zum Schreiben geöffnete Datei geschlossen
CLOSE_NOWRITE Schreibgeschützte Datei geschlossen
CREATE Neue Datei angelegt
DELETE Datei gelöscht
DELETESELF Überwachtes Verzeichnis gelöscht
MODIFY Datei modifiziert
MODIFYSELF Überwachtes Verzeichnis modifiziert
MOVEDFROM Datei aus dem überwachten Verzeichnis verschoben
MOVEDTO Datei ins überwachte Verzeichnis verschoben
OPEN Datei geöffnet

Die interne Schnittstelle zu Inotify dokumentiert die entsprechende Manpage, die Sie über man 7 inotify aufrufen. Als Anwender können Sie auf die Events nicht unmittelbar zugreifen. Dafür gibt es eine Reihe von Werkzeugen, mit deren Hilfe Sie in der Shell und in Skripten die entsprechenden Informationen auswerten. Zu den wichtigsten davon gehören:

  • Inotify-Tools: enthält mit Inotifywait und Inotifywatch zwei Tools für einfache Aufgaben.
  • Iwatch: ein sehr einfach anzuwendendes Werkzeug.
  • FsWatcher: ein komplexes Tool mit vielen Funktionen.
  • Inotail: eine Inotify-gesteuerte Version von Tail als Alternative zum Aufruf tail -F Datei.
  • Fsniper: ein konfigurationsgesteuerter Inotify-Monitor mit recht umständlicher Syntax.
  • Watchman: ein konfigurationsgesteuerter Inotify-Monitor mit zahlreichen Funktionen.
  • DirEvent: die GNU-kompatible, systemunabhängige Version.

Diese Reihe ließe sich noch mit weiteren Programmen fortsetzen, die Ähnliches bieten. Aber auch andere Anwendungen wie Cron (Incron) und Desktop-Suchmaschinen wie Beagle, Strigi und Recoll nutzen gern die Möglichkeit, sich mithilfe von Inotify über neue Dateien oder Änderungen informieren zu lassen, um diese dann zu indizieren.

Etwas weiter als die typischen Inotify-Programme geht DirEvent: Das GNU-Programm ist in der Lage, sowohl Inotify als auch alternative Mechanismen zu verwenden, um Änderungen am Dateisystem festzustellen. Allerdings lässt sich DirEvent nur über eine Konfigurationsdatei nutzen – von daher eignet sich das Programm nicht wirklich für den Einsatz auf der Befehlszeile oder in Skripten.

Inotify-Tools

Für den Einsatz auf der Befehlszeile und in Skripten eignen sich die Inotify-Tools – und dort insbesondere Inotifywait – sowie Iwatch am besten.

Inotifywait funktioniert wie folgt: Sie definieren die zu überwachenden Dateien und die auszuwertenden Events. Sobald eine entsprechende Situation auftritt, terminiert es, und ein Skript oder eine Shell-Funktion führt den nächsten Befehl aus. Der ruft dann die gewünschte Aktionen auf. Normalerweise kommt Inotifywait innerhalb einer Schleife zum Einsatz, um beliebig oft auf die Events reagieren zu können.

Ein typisches Skript dazu zeigt Listing 1. Dort überwacht modify die im ersten Argument ($1) übergebene Datei auf Änderungen. Der Vorteil dieser Methode: Bei Eintreffen des Events lassen sich beliebig viele Aktionen – hier das Sortieren eines Index und gegebenenfalls das Erstellen eines Glossars – ausführen.

Listing 1

#!/bin/bash
while date; do
  inotifywait -e modify "$1"
  makeindex -g -s k+g2.ist "${1%%.*}.idx"
  nice xelatex "$@"
done

Der Parameter "${1%%.*}.idx" nutzt die Bash-Routinen, um den Namen der Indexdatei aus dem Namen der überwachten Datei (mit der Endung .tex) zu erstellen. Nach Abschluss von Makeindex erfolgt ein erneutes Übersetzen des Quelltexts. Dem sehr einfach gehaltenen Skript fehlt insbesondere jegliche Fehlerbehandlung, etwa eine Prüfung der Eingabedatei oder eine Vorsorge für den Fall, dass Makeindex mit einem Fehler abbricht.

Optionen

Eine Reihe von Optionen steuert das genaue Verhalten von Inotifywait. So schränken -e Event oder --event Event ein, welche Events das Tool beachtet. Fehlt diese Angabe, wertet inotifywait alle Ereignisse aus. Die Option -t Zeit oder --timeout Zeit gibt die Wartezeit auf das Event in Sekunden ab. Nach Ablauf dieser Frist beendet sich das Programm, auch wenn der Event nicht auftrat.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 3 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
KAUFEN
LinuxUser 01/2017 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: