Dateien und Verzeichnisse mit Incron überwachen

watchara rojjanasain, 123RF

Kontrolldatei

Incron liefert eine einfache Möglichkeit, Befehle und Skripte durch Dateisystem-Events auszulösen. So verschickt das System beispielsweise automatisch E-Mails, wenn neue Dokumente vorliegen.
ADMIN 03/14 stellt Erste-Hilfe-Tipps zu Windows-Rettung, Backup und Recovery bei Datenbanken vor und verrät wie man Linux-Systeme vollständig sichert und ... (mehr)

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:

  • Pfad: das zu beobachtende Verzeichnis oder eine Datei
  • Maske: die zu registrierenden Ereignisse (siehe Tabelle 1 )

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).

  • Befehl: der auszuführende Befehl oder ein Shell-Skript

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 $#

Automatischer Apache

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 ):

Abbildung 1: Der Apache-Webserver protokolliert einen durch Incron ausgelösten Neustart.
/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.

Gegen die Unendlichkeit

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 $#

Ähnliche Artikel

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023