Incron – Ein Fileevent basierter Cron
1
Februar
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.

Hallo Sascha,
danke für den Beitrag. Ich musste gerade bei einem bestehenden System Anpassungen an den Incron Dienst vornehmen und dabei hat mir Deine Einführung geholfen.
Auf meinem Debiansystem musste ich aber schon den Dienst mit /etc/init.d/incron restart neustarten, wenn ich Veränderungen im Ordner /etc/incron.d/ durchgeführt habe. Ich hatte das in Deinem Artikel so verstanden, dass wenn neue Dateien dort angelegt werden, müssten der Dienst nicht neugestartet werden. Vielleicht ja auch ein Verständigungsproblem?
Liebe Grüße,
Torsten
Hallo Torsten
Schön dass ich dir helfen konnte.
Bei mir funktionierte das unter RHEL aber ohne service restart oder reload. Hatte mich auch gewundert und habe es deswegen auch im Artikel so geschrieben. Daher hast du es nicht falsch verstanden.
Ein restart tut ja aber nicht weh…
VG
S.