Mit Inotify das Dateisystem überwachen

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.

Der Schalter -r oder --recursive überwacht Verzeichnisse inklusive aller Unterverzeichnisse. Diese Option sollten Sie mit Bedacht verwenden: Zum einen lösen eventuell ungewollte Änderungen versehentlich die Bearbeitung aus, zum anderen benötigt die Verwaltung von tief verzweigten Verzeichnisbäumen zusätzliche Ressourcen.

Die Option @Ausnahme(n) klammert die angegebenen Datei(en) bei der Beobachtung aus. Das ist insbesondere für automatisch erzeugte Dateien sinnvoll, beispielsweise für Backups. Ähnlich funktionieren --exclude Muster und --excludei Muster: Sie definiert Muster für zu ignorierende Dateinamen, im ersten Fall ohne und im zweiten unter Berücksichtigung der Schreibweise.

Die Option --fromfile Datei definiert die zu überwachenden Dateien über eine Datei mit den Pfaden. Der Schalter -m oder --monitor sorgt dafür, dass das Programm nicht mehr terminiert, sondern bis zum Eintreffen eines externen Signals (etwa kill pid) weiterarbeitet.

Inotifywatch

Ebenfalls zu den Inotify-Tools gehört inotifywatch. Das Programm funktioniert ähnlich wie Inotifywait, dient aber lediglich dem Sammeln von Informationen und nicht dem Ausführen von Aktionen. Es verfügt über fast dieselben Optionen wie Inotifywait. Sie verwenden Inotifywatch hauptsächlich, um Probleme aufzudecken oder sich einen Überblick zu verschaffen, was in einem Dateisystem oder Verzeichnis gerade geschieht.

Iwatch

Iwatch [2] stellt eine noch einfachere Möglichkeit dar, beim Auftreten eines Events einen Befehl oder ein Skript (so lassen sich dann auch mehrere Kommandos ausführen) zu starten. Iwatch wurde mit Blick auf Einfachheit in der Anwendung entwickelt, die Syntax des Befehls zeigt Listing 2. Den Zeichensatz brauchen Sie normalerweise nicht anzugeben, UTF-8 ist voreingestellt.

Listing 2

$ iwatch -c "Befehlszeile" [-C Zeichensatz] [-e Event]...

Geben Sie Befehlszeilen als Argument von -c an, die Leerzeichen enthalten, dann müssen Sie diese in Hochkommas einschließen. Einfache Hochkommas verhindern die Expansion von Shell-Funktionen, wohingegen doppelte das zulassen. Durch die Hochkommas lassen sich auch komplexere Befehlszeilen verwenden, in denen Strichpunkte (;) die Einzelteile trennen. Interessanterweise gibt es dabei noch die Möglichkeit, auf bestimmte “Teile” des Events zuzugreifen: Der Platzhalter %e steht beispielsweise für den Namen des Events und %f für den Pfad und Namen der auslösenden Datei.

Listing 3 zeigt ein einfaches Beispiel für den Gebrauch von Iwatch. Durch *.adoc löst jede Veränderung an den ASCIIDOC-Quelltexten eine Neubearbeitung aus. Dazu übersetzt das Programm die “Master”-Datei route5-2016.adoc erneut mit a2x.

Listing 3

$ iwatch -c "a2x -v -a lang=de -f pdf -dbook route5-2016.adoc ; date" -e modify *.adoc &

Der Schalter -r veranlasst Iwatch, rekursiv zu arbeiten. Mit -d versetzen Sie das Programm in einen Daemon-Modus, analog zu inotifywait -d oder inotifywait -m. In diesem Modus steuert maßgeblich eine Konfigurationsdatei das Verhalten des Programms. Durch -t lässt sich eine Filterfunktion über eine Positivliste aktivieren, die Iwatch beim Überwachen der Dateien auswertet.

So einfach Iwatch auch funktioniert, hat es doch zwei Schattenseiten. Da es in Perl geschrieben wurde, gilt es, eine Menge von Abhängigkeiten aufzulösen. In der Praxis bedeutet das, dass es regelmäßig zu Versionskonflikten kommt. Dann hilft eigentlich nur noch die Deinstallation, das Entfernen aller Abhängigkeiten und eine Neuinstallation. Zudem verfügt Iwatch über keine Manpage. Stattdessen erhalten Sie über die Option -h eine recht umfangreiche Hilfe.

Eine komplette Dokumentation des Programms finden Sie auf der Homepage [3]. Dort erfahren Sie auch, dass Sie mittels -x Ausnahme(n) und -X Muster definieren können, welche Dateien keine Trigger liefern sollen.

Bemerkenswertes

Die vom Kernel unterstützte Anzahl von überwachten Dateien definiert ein Wert in der Pseudo-Datei /proc/sys/fs/inotify/max_user_watches. Voreingestellt sind oft kleine Werte wie 8192 oder dergleichen. Dieses Limit überschreiten Sie schon beim testweisen Überwachen eines etwas besser gefüllten Home-Verzeichnisses schnell (Listing 4, Zeile 1 bis 4). Mit Root-Rechten lässt sich der Wert jedoch jederzeit anpassen (Listing 4, Zeile 5ff.).

Listing 4

$ inotifywatch -v -t 60 -r ~
Establishing watches...
Setting up watch(es) on ~
Failed to watch ~; upper limit on inotify watches reached!
$ cat /proc/sys/fs/inotify/max_user_watches
8192
$ echo 16384 | sudo tee /proc/sys/fs/inotify/max_user_watches
16384
$ cat /proc/sys/fs/inotify/max_user_watches
16384

Bei der Konfiguration von Programmen wie Incron gilt es, mit Vorsicht zu agieren. Solche Tools kommen oft beim Überwachen großer Verzeichnisbäume zum Einsatz. Passt man dabei nicht penibel auf, treten Endlosschleifen auf, weil Incron die Ergebnisse in Dateien ablegt, die wiederum in den überwachten Bereichen liegen. Solche Schleifen legen im schlimmsten Fall das gesamte System lahm. 

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 01/2017 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben