Automatisierung mit Linux-Dateisystemereignissen: Reagieren auf neue Dateien
Dieses Tutorial zeigt Ihnen, wie Sie Linux-Dateisystemereignisse (in Form von Benachrichtigungen) nutzen können, um automatisch informiert zu werden, sobald eine Datei in einem bestimmten Verzeichnis erscheint. Diese Benachrichtigungen können als Auslöser verwendet werden, um wiederkehrende Aufgaben auf Ihrem System zu automatisieren.
Wir entwickeln ein Skript, das ein Verzeichnis überwacht und auf neu hinzugefügte Dateien reagiert. Jede entdeckte Datei wird komprimiert (gezippt) und anschließend in ein anderes Verzeichnis verschoben. Das Skript verwendet das inotify-Subsystem mit Hilfe eines Werkzeugs namens inotify-tools. Bevor wir jedoch mit dem Skript beginnen, installieren wir das Werkzeug und experimentieren damit.
Installation von inotify-tools und gzip
Wenn Sie Ubuntu oder eine andere Debian-basierte Distribution verwenden, können Sie dieses Paket mit apt-get installieren. Für andere Linux-Distributionen verwenden Sie bitte das Paketverwaltungstool Ihrer jeweiligen Distribution.
sudo apt-get install inotify-tools gzip
Erste Schritte mit inotify-tools
Beginnen wir mit der Überwachung eines Verzeichnisses, um zu sehen, welche Ereignisse ausgelöst werden, wenn neue Dateien hinzugefügt werden. Wir nutzen das Programm `inotifywatch`, das Teil von inotify-tools ist. Erstellen Sie zunächst ein Verzeichnis namens „incoming“:
mkdir incoming
Starten Sie nun die Überwachung dieses Verzeichnisses mit dem folgenden Befehl:
inotifywatch -v incoming
Dieser Befehl weist inotify an, auf alle Dateisystemereignisse im Verzeichnis „incoming“ zu achten. Die Option -v sorgt dafür, dass das Tool zusätzliche Informationen zu seinen Aktionen ausgibt. Da wir keine Timeout-Option (-t) angegeben haben, erfasst der Befehl Ereignisse, bis wir ihn mit STRG+C beenden. Ihr Terminal sollte zu diesem Zeitpunkt in etwa so aussehen:
Öffnen Sie ein neues Terminalfenster (oder einen neuen Tab) und wechseln Sie in das Verzeichnis „incoming“. Verwenden Sie den Befehl `touch`, um eine neue Datei namens „newfile“ zu erstellen.
cd incoming/ touch newfile
Kehren Sie zum ersten Terminalfenster zurück und beenden Sie inotifywatch durch Drücken von STRG+C.
In der Konsole wird eine Ereignistabelle angezeigt, die Einträge für „create“, „open“, „attrib“ und „close_write“ enthält. Diese vier Ereignisse wurden ausgelöst, als wir mit dem Befehl `touch` eine neue Datei erstellten, deren Dateizugriffsattribute festlegten, sie öffneten, um ein Null-Terminierungszeichen zu schreiben, und sie anschließend wieder schlossen. Dies sind nur einige der vielen Ereignisse, die auf einem Dateisystem mit inotify-tools überwacht werden können. Eine vollständige Liste finden Sie auf der Manpage von inotifywatch.
Für unsere Zwecke sind nur zwei Ereignisse von Interesse:
- „create“: Wenn eine Datei im Zielverzeichnis erstellt wird.
- „moved_to“: Wenn eine Datei von einem anderen Ort in das Zielverzeichnis verschoben wird.
Lassen Sie uns inotifywatch erneut verwenden, aber diesmal so konfigurieren, dass nur diese beiden Ereignisse überwacht werden. Führen Sie diesen Befehl im ersten Terminalfenster aus:
inotifywatch -v -e create -e moved_to incoming
Versuchen Sie im zweiten Terminalfenster oder Tab, eine neue Datei zu erstellen, deren Inhalt zu ändern und die Datei dann von einem anderen Speicherort in das Zielverzeichnis zu verschieben. Alle diese Befehle werden vom Home-Verzeichnis aus ausgeführt.
touch incoming/created echo Testing123 >> incoming/created touch /tmp/created2 mv /tmp/created2 incoming/
Kehren Sie zum ersten Terminalfenster zurück und beenden Sie inotifywatch durch Drücken von STRG+C. Sie sollten nun die folgende Ausgabe sehen:
Es wurden nur zwei Ereignisse erfasst: die Erstellung der Datei „created“ und das Verschieben der Datei „created2“. Andere Ereignisse, wie beispielsweise die Änderung von „created“, wurden ignoriert.
Überwachung eines Verzeichnisses und Ausführen einer Aufgabe
Nachdem wir nun wissen, welche Ereignisse wir überwachen müssen, können wir ein anderes Werkzeug namens `inotifywait` verwenden. Dieses Tool blockiert die Ausführung, bis eine Datei in unserem Zielverzeichnis erstellt oder dorthin verschoben wird. Wir verwenden die gleichen Argumente wie bei inotifywatch und geben zusätzlich an, wie der Dateiname für unsere Aufgabe formatiert werden soll.
Bevor wir beginnen, benötigen wir ein Verzeichnis, um Dateien zu speichern, die bereits verarbeitet wurden. Erstellen Sie ein Verzeichnis namens „processed“:
mkdir processed
Erstellen Sie als Nächstes ein neues Skript mit dem Namen „watch-incoming.sh“ und fügen Sie den untenstehenden Inhalt hinzu:
#!/bin/bash TARGET=~/incoming/ PROCESSED=~/processed/ inotifywait -m -e create -e moved_to --format "%f" $TARGET | while read FILENAME do echo Detected $FILENAME, moving and zipping mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME" gzip "$PROCESSED/$FILENAME" done
Das Skript führt den Befehl `inotifywait` mit der Option `-m` aus, wodurch der Befehl dauerhaft im Überwachungsmodus bleibt. Jedes Mal, wenn ein neues Ereignis erkannt wird, wird der Dateiname an den `read`-Befehl übergeben und in der Variable „FILENAME“ gespeichert. Der Codeblock innerhalb der `while`-Schleife wird ausgeführt, in dem die Datei zuerst in das Verzeichnis „processed“ verschoben und anschließend mit `gzip` komprimiert wird. Die Originaldatei wird durch die komprimierte Datei ersetzt, und der Dateiname erhält die Endung „.gz“.
Erteilen Sie dem Skript Ausführungsberechtigungen und führen Sie es von Ihrem Home-Verzeichnis aus:
chmod u+x watch-incoming.sh ./watch-incoming.sh
Öffnen Sie das zweite Terminalfenster und erstellen Sie eine neue Datei im Verzeichnis „incoming“. Überprüfen Sie die Inhalte der Verzeichnisse „incoming“ und „processed“, um die Ergebnisse des erkannten Ereignisses anzuzeigen:
Die Textdatei, die wir in das Verzeichnis „incoming“ kopiert haben, wurde vom Skript erkannt, nach „processed“ kopiert und anschließend mit `gzip` komprimiert.
Nun, da wir in der Lage sind, neue Dateien, die in einem Verzeichnis eingehen, zu erkennen, können wir einige interessante Aufgaben automatisieren. So könnten wir beispielsweise Bilddateien mit einem Wasserzeichen versehen, Rohvideos in das MP4-Format komprimieren oder sogar jede neue Datei, die auftaucht, in einen Amazon S3-Bucket hochladen. Dieses Skript ist ein guter Ausgangspunkt für die Erstellung eigener Arbeitsabläufe und die Automatisierung häufiger Aufgaben auf Ihrem System.