Incron – Ein Fileevent basierter Cron

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

5 Responses to Incron – Ein Fileevent basierter Cron

  1. Herzlichen Dank für den Artikel, die Infos haben mir sehr geholfen! So müssen nicht alle Devs bei jeden hoch laden von Dateien die Rechte manuell setzen.

    Ist zwar etwas her aber ich denke über positive Reaktionen der Leser freut man sich :-)

    • Sascha

      Hallo André
      klar freu ich mich über positive Reaktion.
      Bei deiner Problemstellung sehe ich aber eher File ACLs als die elegantere Lösung an.
      Schau dir mal “setfacl -d” an. Damit kann man nämlich für neue Dateien verschiedene User- oder Gruppenberechtigungen sehr fein konfigurieren.
      Das funktioniert dann auch gleich rekursiv für neue Verzeichnisse (was ja mit dem incron ja nicht klappt).
      VG Sascha

  2. toddy

    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

    • Sascha

      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.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>