Wer unter Linux ein Kommando starten möchte, sobald ein bestimmtes Ereignis eintritt, braucht nicht umständlich Log-Dateien auszulesen oder regelmäßige Anfragen zu schicken. Das Werkzeug Incron setzt auf das Kernel-Subsystem Inotify [1], um auf Ereignisse zu reagieren, die das Dateisystem betreffen, beispielsweise beim Öffnen, Erstellen oder Löschen einer Datei, einem Zugriff auf ein Verzeichnis oder einer Veränderung von Attributen.
Der Name Incron erinnert absichtlich an das Standardwerkzeug Cron. Während sich Incron allerdings an Dateisystemereignissen orientiert, startet Cron Jobs auf Basis von Zeitpunkten.
Die Wurzeln von Incron
Der Zusatz »In
«
in Incron stammt von »Inode
«
. Diese Datenstruktur enthält die Details jeder Datei und jedes Verzeichnisses im Dateisystem, etwa den physischen Speicherort auf der Platte, die Größe und den Besitzer.
Von Inode leitet sich auch der Name von Inotify ab, dem Subsystem des Linux-Kernels, auf dem Incron basiert. Es beobachtet Dateien und Verzeichnisse und benachrichtigt bei Änderungen auf Anfrage Anwendungen aller Art. Beispielsweise zeigt ein grafischer Dateimanager ein Symbol für einen neu erstellten Ordner im aktuellen Verzeichnis direkt an, auch wenn ein anderes Programm diesen erzeugt hat. Die Gnome- und KDE-Dateimanager Nautilus beziehungsweise Dolphin setzen auf Inotify, wie auch einige Texteditoren, die mit Inotify feststellen, ob ein anderer Benutzer oder ein anderes Programm eine Datei zwischenzeitlich verändert hat.
Nur wenige Distributionen installieren Incron standardmäßig, die meisten halten es aber in ihren Repositories für die Installation mit dem Paketmanager vor. Wer die Quellen begutachten und kompilieren möchte, findet sie auf der Projekt-Homepage [1].
Die zentrale Komponente von Incron bildet der Daemon »incrond
«
. Er startet Programme gemäß den Einträgen in der benutzerspezifischen Incron-Job-Tabelle »incrontab
«
, die man analog zu Cron mit dem Befehl »incrontab -e
«
editiert. Dabei kommt der in der Umgebungsvariablen »$EDITOR
«
eingetragene Texteditor zum Einsatz.
Je nach Distribution verlangt Incron eine explizite Erlaubnis. Dafür trägt man die gewünschten Benutzer – ein Name je Zeile – in die dafür zuständige Incron-Konfigurationsdatei ein, standardmäßig »/etc/incron.allow
«
.
Jeder Incron-Auftrag besteht aus drei Spalten und steht – wiederum wie bei Cron – in einer eigenen Zeile. Die drei Teile eines Incron-Jobs lauten:
Tabelle 1
Incron-Events
Ereignisname | Bedeutung |
---|---|
Allgemeine Ereignisse |
|
IN_ACCESS |
Zugriff (Lesen). |
IN_ATTRIB |
Metadaten geändert (Berechtigungen, Zeitstempel, erweiterte Attribute). |
IN_CLOSE_WRITE |
Zum Schreiben geöffnete Datei geschlossen. |
IN_CLOSE_NOWRITE |
Nicht zum Schreiben geöffnete Datei geschlossen. |
IN_CLOSE |
Geöffnete Datei wird geschlossen. |
IN_CREATE |
Datei oder Verzeichnis in beobachtetem Verzeichnis erstellt. |
IN_DELETE |
Datei oder Verzeichnis in beobachtetem Verzeichnis gelöscht. |
IN_DELETE_SELF |
Beobachtete Datei oder Verzeichnis gelöscht. |
IN_MODIFY |
Datei in beobachtetem Verzeichnis verändert. |
IN_MOVE_SELF |
Beobachtete Datei oder Verzeichnis verändert. |
IN_MOVED_FROM |
Datei aus beobachtetem Verzeichnis verschoben. |
IN_MOVED_TO |
Datei in beobachtetes Verzeichnis verschoben. |
IN_MOVE |
Datei in oder aus beobachtetem Verzeichnis verschoben. |
IN_OPEN |
Datei geöffnet. |
Spezielle Ereignisse |
|
IN_ALL_EVENTS |
Irgendein Ereignis. |
IN_DONT_FOLLOW |
Symbolischen Links nicht folgen. |
IN_ONESHOT |
Datei oder Verzeichnis nur für ein Ereignis beobachten. |
IN_ONLYDIR |
Angegebenen Pfad nur dann beobachten, wenn es ein Verzeichnis ist. |
Wildcard-Ereignisse |
|
IN_NO_LOOP |
Beobachten unterbrechen, sobald ein Ereignis ausgelöst worden ist, bis der entsprechende Befehl beendet ist (verhindert Endlosschleifen). |
Eine Zeile in der Incrontab-Datei sieht beispielsweise so aus:
/home/$USER/my_dir IN_CREATE /home/$USER/bin/hello.sh
Es gilt zu beachten, dass es sich bei Incron nicht um einen Bash-Interpreter handelt. Deshalb empfiehlt sich die Verwendung eines Shell-Skripts, um beispielsweise die Ausgabe eines Befehls umzuleiten. In der Befehlsspalte einer Incrontab-Zeile interpretiert Incron nur den Befehl und seine Parameter. Folgt eine Umleitung wie »>>logfile
«
, erkennt Incron das ebenfalls als Befehlsargument; dass es ungültig ist, interessiert das Programm nicht.
Des Weiteren gilt wie bei Cron, dass Incron die »$PATH
«
-Variable des Benutzers nicht kennt. Deshalb sollte die Angabe des Befehls unter Angabe seines vollständigen Pfades erfolgen.
Um auf die durch Inotify ausgelösten Ereignisse gezielt zu reagieren, hält Incron die Variablen (Wildcards) aus Tabelle 2 vor. Die Ausdrücke beginnen mit dem »$
«
-Zeichen; um das Dollar-Symbol selbst zu verwenden, dient der Ausdruck »$$
«
.
Tabelle 2
Wildcards
Ausdruck | Bedeutung |
---|---|
» |
Name des beobachteten Verzeichnisses |
» |
Name der Datei, die das Ereignis ausgelöst hat |
» |
Ereignisbezeichnung |
» |
Numerisches Ereignissymbol |
Der folgende Eintrag in der Incrontab ruft das Skript »hello.sh
«
mit dem Namen der Datei als Argument auf, die das Ereignis »IN_CREATE
«
ausgelöst hat:
/home/paul/my_dir IN_CREATE /home/paul/bin/hello.sh $#
Als praktisches Beispiel startet Incron etwa einen Server neu, sobald sich dessen Konfigurationsdatei verändert hat. Die folgende Zeile startet den Apache-Webserver mittels Init-Skript neu, sobald sich die Konfigurationsdatei verändert hat (siehe Abbildung 1):
/etc/apache2/apache2.conf IN_MODIFY /etc/init.d/apache2 restart
Allerdings verwendet der Apache-Webserver üblicherweise verschiedene Konfigurationsdateien für seine zahlreichen Module. Der folgende Incrontab-Eintrag löst deshalb einen Neustart aus, sobald ein Benutzer eine neue Datei im Unterverzeichnis »conf.d
«
anlegt, das unter Debian die Apache-Konfigurationsdateien enthält; bei anderen Distributionen weicht der Verzeichnisname allerdings ab:
/etc/apache2/conf.d/ IN_CREATE /etc/init.d/apache2 restart
Bei anderen Linux-Varianten käme hier etwa das Verzeichnis »/etc/apache2/conf-enabled
«
infrage. Außerdem verwenden SysV-Init-basierte Distributionen den Befehl »service apache2 restart
«
, um den Webserver neu zu starten.
Sollen neben neu angelegten Dateien auch Veränderungen an bestehenden Files den Server-Neustart auslösen, reiht man die beiden Ereignisse mit Kommas getrennt aneinander, denn ein Pfad darf nur einmal in der Incrontab-Datei auftauchen:
/etc/apache2/conf.d/ IN_CREATE,IN_CLOSE_WRITE /etc/init.d/apache2restart
Die separate Behandlung der Verzeichnisse »/etc/apache2
«
und des Unterverzeichnisses »conf.d
«
in den vorhergehenden Beispielen lässt sich übrigens nicht einfach umgehen. Incrontab bietet keine Möglichkeit, ein Verzeichnis rekursiv zu überwachen.
Das sogenannte Wildcard-Ereignis »IN_NO_LOOP
«
verhindert, dass ein Event in einem Verzeichnis zu einer endlosen Kette weiterer Ereignisse führt. Typischer Anwendungsfall ist eine Konfiguration, in der eine Log-Datei die Änderungen in einem Verzeichnis protokolliert:
Verzeichnis IN_CLOSE_WRITE log_changes $#
Das Kommando »log_changes
«
im Beispiel schreibt den Namen der veränderten Datei in eine Log-Datei. Liegt diese im selben Verzeichnis, würde der dem Protokoll hinzugefügte Eintrag wiederum ein Änderungsereignis auslösen.
Gegen eine solche Endlosschleife hilft »IN_NO_LOOP
«
. Es setzt den Eintrag außer Kraft, bis der Befehl »log_changes
«
abgeschlossen ist:
Verzeichnis IN_CLOSE_WRITE,IN_NO_LOOP log_changes $#