Zeitgesteuert Skripte oder Programme über Cron zu starten ist ja schon sehr praktisch. Nicht selten möchte man aber sofort eine neue Datei verarbeiten, sobald diese im Dateisystem erzeugt wurde. Bevor man aber nun einen Cronjob einplant, der im Minutentakt prüft ob neue Dateien angelegt wurden, gibt es eine viel elegantere Methode sofort, ohne Zeitverlust zu reagieren. Hier kommt incron ins Spiel.

incron

incron arbeitet ähnlich wie das bekannte cron, wird aber nicht zeitlich sondern durch Dateisystem Events gesteuert. So ist es möglich mehrere Verzeichnisse zu überprüfen und wenn auf eine Datei zugegriffen wird, ein entsprechendes Programm zu starten.

Wir verwenden incron auf einem SFTP Server, der einkommende Dateien sofort an die weiterverarbeitenden Stellen verschiebt. Unnötige Wartezeiten gehören der Vergangenheit an.

Eine Voraussetzung für incron ist, dass man mindestens einen 2.6.13er Linux Kernel mit inotify einsetzt (sollte bei allen aktuellen Linuxkerneln als default gesetzt sein).

Quellen

Die Sourcecodes können bei folgender Adresse herunter geladen werden: http://inotify.aiken.cz/

Hier sind auch weitere Dokus und FAQs zu dem Thema inotify zu finden.

Wer den bequemen Weg wählen möchte, hier gibt es unter anderem RPM Pakete:

http://rpmfind.net/linux/rpm2html/search.php?query=incron

Installation

Nach der Installation hat man sein System um zwei Binaries, einem Startskript, einem Configverzeichnis und einer Configdatei bereichert. In der Hauptkonfigurationsdatei /etc/incron.conf können diverse Pfade gesetzt und sogar der Zugriff auf incrontabs für Benutzer (neben system incrontabs) konfiguriert werden.

Nun nur noch das Startskript incrond starten.

service incrond start

Konfigurationsbeispiel

Um System-incrontabs einzurichten erstellt man eine entsprechende Datei in dem Verzeichnis /etc/incron.d/.

Beispiel:   /etc/incron.d/watch_sftpin:

/data/sftpin IN_CLOSE_WRITE mv $@/$# /data/save

Mit dieser Konfiguration wird jede Datei, die in /data/sftpin erzeugt wird von incrond sofort nach /data/save verschoben.

Genauer: Sobald eine Datei mit dem Event IN_CLOSE_WRITE, also nach einem Schreiben geschlossen wurde wird der Befehl hinter IN_CLOSE_WRITE ausgeführt (move Datei nach save). $@ ist hier Platzhalten für das überprüfte Verzeichnis und $# beinhaltet den Namen der entsprechenden Datei.

Änderungen an den incrontab-Dateien werden sofort, ohne Serviceneustart übernommen.

Aber ACHTUNG: Leider dürfen die Argumenten in der incrontab nur mit genau EINEM Leerzeichen getrennt sein, sonst funktioniert es nicht.

Test des Beispiels:

[root@server data]# echo "test" >sftpin/hallo
[root@server data]# ll sftpin/
total 0
[root@server data]# ll save/
total 4
-rw-r--r-- 1 root root 4 Jan 27 17:04 hallo
[root@server data]#

Die Datei “hallo” wird sofort nach save verschoben.

Man kann auch verschiedene Fileevents reagieren:

  • IN_ACCESS           Datei wurde lesend geöffnet
  • IN_ATTRIB           Metadaten sind geändert worden (permissions, timestamps, extended attributes, etc.)
  • IN_CLOSE_WRITE      Datei wurde nach schreibendem Zugriff geschlossen
  • IN_CLOSE_NOWRITE    Datei wurde geschlossen ohne dass etwas geschrieben wurde
  • IN_CREATE           Datei oder Verzeichnis wurde erstellt
  • IN_DELETE           Datei oder Verzeichnis wurde gelöscht
  • IN_DELETE_SELF           Überprüftes Verzeichnis selbst wurde gelöscht
  • IN_MODIFY           Datei wurde geändert
  • IN_MOVE_SELF        Überprüftes Verzeichnis selbst wurde verschoben
  • IN_MOVED_FROM       Datei ist aus überprüftem Verzeichnis verschoben worden
  • IN_MOVED_TO         Datei ist in überprüftes Verzeichnis geschoben worden
  • IN_OPEN             Datei ist geöffnet worden

Folgende Variablen kann man verwenden:

  • $@ – Der Name des überprüften Verzeichnis selbst
  • $# – Name der betroffenen Datei
  • $% – Das entsprechende Event (Textform)
  • $& – Das entsprechende Event (Nummerische Form)
  • $$ – Ein Dollarzeichen

Fazit

Uns hat incrond einiges an sinnlosen Warteschleifencronjobs eingespart und die Verarbeitung an manchen Stellen sehr beschleunigt. Ich hoffe euch hilft incron auch.

2.6.13