incron - Dateisystemevents
Cronjobs sind praktisch und fast jeder Admin nutzt sie. Leider finden sich häufig auch Jobs in der Liste, die sehr häufig ausgeführt werden (z.B. jede Minute), weil der Admin nicht weiß, wann es tatsächlich nötig wäre, den Job zu starten. Häufig kann hier incron
helfen.
Anders als klassische Cronjobs funktioniert incron
nicht zeitbasiert, sondern achtet auf Events im Dateisystem. So lassen sich Aufgaben ausführen, wenn z.B. in einem Verzeichnis eine neue Datei erzeugt wird.
Die Installation erfolgt mittels:
apt install incron
Anschließend wird die Datei /etc/incron.allow
mit den Benutzernamen befüllt, die incron
verwenden dürfen:
root
Die eigentlichen Jobs können, ähnlich wie bei Cronjobs, mit dem Befehl incrontab -e
editiert und mittels incrontab -l
aufgelistet werden, alternativ kann pro Job eine Datei in /etc/incron.d/
erzeugt werden.
Der Aufbau einer Jobdefinition ähnlich dem eines Cronjob, enthält aber natürlich keine Zeitangaben. Stattdessen werden Dateisystemevents genutzt, folgende Events sind möglich:
Event | Beschreibung |
---|---|
IN_ACCESS | Datei wurde gelesen |
IN_ATTRIB | Metadaten wurden geändert (permissions, timestamps, etc.) |
IN_CLOSE_WRITE | Zum schreiben geöffnete Datei wurde geschlossen |
IN_CLOSE_NOWRITE | Zum lesen geöffnete Datei wurde geschlossen |
IN_CREATE | Datei/Verzeichnis wurde erzeugt |
IN_DELETE | Datei/Verzeichnis wurde gelöscht |
IN_DELETE_SELF | Die überwachte Datei/Verzeichnis selbst wurde gelöscht |
IN_MODIFY | Datei wurde verändert |
IN_MOVE_SELF | Die überwachte Datei/Verzeichnis selbst wurde verschoben |
IN_MOVED_FROM | Eine Datei wurden aus dem überwachten Verzeichnis heraus verschoben |
IN_MOVED_TO | Eine Datei wurden in das überwachte Verzeichnis verschoben |
IN_OPEN | Eine Datei wurde geöffnet |
IN_ALL_EVENTS | Einer der oben aufgeführten Events (egal welcher) |
IN_DONT_FOLLOW | Der überwachte Pfad/Datei darf kein Symlink sein |
IN_ONESHOT | Überwacht einen Pfad für nur einen einzigen Event |
IN_ONLYDIR | Events werden nur beachtet, wenn der zu überwachende Pfad keine Datei ist |
IN_NO_LOOP | Verhindert die Überwachung weiterer Events, so lange der erste Event nicht vollständig abgearbeitet wurde |
Mehrere Events können miteinander Kombiniert werden, die einzelnen Events werden hierbei mittels Komma getrennt, z.B.: IN_ATTRIB,IN_CLOSE_WRITE
Der Aufbau der Jobdefinition besteht immer aus <pfad/datei> <event> <befehl>
, also z.B.:
/var/logs/errors/ IN_CREATE /opt/notify/log_notify.sh $@ $# $%
Mit der obigen Jobdefinition würde incron
immer dann wenn eine Datei in /var/logs/errors/
erstellt wird, das Script /opt/notify/log_notify.sh
ausführen. Außerdem würden einige Parameter an das Script übergeben, die das Script dann nutzen kann. Folgende Parameter sind möglich:
Parameter | Beschreibung |
---|---|
$$ | Übergibt ein $ Zeichen (statisch) |
$@ | Übergibt den überwachten Pfad (/var/logs/foobar ) |
$# | Übergibt den Dateinamen (der neu erzeugten Datei) |
$% | Übergibt Event-Flags als Text (IN_CREATE ) |
$& | Übergibt Event-Flags als Zahl |
Das Script könnte dann z.B. wie folgt aussehen:
#!/bin/bash
cat ${1}${2} | mail -s "Error ${2}" fixme@invalid.org
Sobald also in /var/log/errors/
eine neue Datei erzeugt wurde, wird das Script ausgeführt, welches dann die neu erzeugte Datei ausgibt und per Mail versendet. Hierbei sollte man vorsichtig sein, da man sonst von Mails erschlagen wird, aber ich denke das Prinzip wird soweit ganz gut klar.