So führen Sie eine Aufgabe aus, wenn eine neue Datei zu einem Verzeichnis in Linux hinzugefügt wird

Dieses Tutorial zeigt Ihnen, wie Sie Linux-Dateisystemereignisse (benachrichtigen) verwenden, um jedes Mal benachrichtigt zu werden, wenn eine Datei in einem Verzeichnis erscheint. Sie können diese als Auslöser verwenden, um allgemeine Aufgaben auf Ihrem System zu automatisieren.

Wir werden ein Skript schreiben, das ein Verzeichnis überwacht und auf neu hinzugefügte Dateien reagiert. Jede Datei wird gezippt und in ein anderes Verzeichnis verschoben, sobald sie erkannt wird. Das Skript verwendet das Subsystem inotify über ein Dienstprogramm namens inotify-tools. Aber zuerst installieren wir das Tool und experimentieren.

Installieren von inotify-tools und gzip

Verwenden Sie apt-get, um dieses Paket auf Ihrem System zu installieren, wenn Sie Ubuntu oder eine andere Debian-basierte Distribution verwenden. Verwenden Sie bei anderen Linux-Distributionen stattdessen das Paketverwaltungstool Ihrer Linux-Distribution.

sudo apt-get install inotify-tools gzip

Experimentieren mit inotify-Tools

Beginnen wir damit, ein Verzeichnis zu beobachten und zu sehen, welche Ereignisse ausgelöst werden, wenn neue Dateien eintreffen. Wir werden ein Tool namens inotifywatch verwenden, das Teil von inotify-tools ist. Erstellen Sie ein neues Verzeichnis namens „incoming“:

mkdir incoming

Beginnen Sie mit der Überwachung dieses Verzeichnisses, indem Sie den folgenden Befehl ausführen:

inotifywatch -v incoming

Dadurch wird inotify angewiesen, auf alle Dateisystemereignisse im Verzeichnis „incoming“ zu achten. Die Option -v bewirkt, dass das Tool zusätzliche Informationen über seine Aktionen ausgibt. Wir haben keine Timeout-Option (-t ) angegeben und der Befehl sammelt so lange Ereignisse, bis wir ihn mit STRG+C beenden. An dieser Stelle sollte unser Terminal ungefähr so ​​aussehen:

  Erhalten Sie mit Stretchly gesunde Erinnerungen auf dem Linux-Desktop

Öffnen Sie ein neues Terminalfenster (oder Tab) und wechseln Sie in das eingehende Verzeichnis. Verwenden Sie den Touch-Befehl, um eine neue Datei namens „newfile“ zu erstellen.

cd incoming/
touch newfile

Gehen Sie nun zurück zum ersten Terminalfenster und stoppen Sie inotifywatch, indem Sie STRG+C drücken.

An der Konsole wird eine Ereignistabelle bereitgestellt, die eine Instanz von „create“, „open“, „attrib“ und „close_write“ angibt. Diese vier Ereignisse traten auf, als wir mit Touch eine neue Datei erstellten, ihre Dateizugriffsattribute festlegten, sie öffneten, um ein Null-Abschlusszeichen 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. Die vollständige Liste finden Sie auf der Hauptseite von inotifywatch.

Für unsere Zwecke sind wir nur an zwei Veranstaltungen interessiert:

„create“ – wenn eine Datei im Zielverzeichnis erstellt wird.
„moved_to“ – wenn eine Datei von einem anderen Ort in das Zielverzeichnis verschoben wird.

Versuchen wir es noch einmal mit inotifywatch, aber dieses Mal weisen wir es an, nur diese beiden Ereignisse zu überwachen. Führen Sie diesen Befehl im ersten Terminalfenster aus:

inotifywatch -v -e create -e moved_to incoming

Versuchen wir im zweiten Terminalfenster oder Tab, eine neue Datei zu erstellen, ihren 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/

Gehen Sie zurück zum ersten Terminalfenster und stoppen Sie inotifywatch, indem Sie STRG+C drücken. Wir sehen die folgende Ausgabe:

  So installieren Sie das Arc-Design für Thunderbird unter Linux

Es wurden nur zwei Ereignisse gezählt: das Erstellen einer Datei namens „created.txt“ und das Verschieben einer bestehenden Datei namens „created2.txt“. Alles andere, wie das Ändern von „created.txt“, wurde ignoriert.

Ein Verzeichnis beobachten und eine Aufgabe ausführen

Da wir nun wissen, welche Ereignisse zu befolgen sind, können wir ein anderes Tool namens inotifywait verwenden, um die Ausführung zu blockieren, bis eine Datei in unserem Zielverzeichnis erstellt oder dorthin verschoben wird. Wir verwenden dieselben Argumente wie bei inotifywatch und geben außerdem 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 namens „watch-incoming.sh“ und fügen Sie die unten aufgeführten Inhalte 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. Dadurch ändert sich der Befehlsmonitor auf unbestimmte Zeit. Jedes Mal, wenn ein neues Ereignis erkannt wird, wird der Dateiname an den Lesebefehl übergeben und in die Variable „FILENAME“ eingefügt. Es wird der Block unter der while-Schleife ausgeführt, in dem die Datei zunächst in das Verzeichnis „verarbeitet“ verschoben und anschließend gzippt wird. Die Originaldatei wird durch die komprimierte Datei ersetzt und der Dateiname endet auf „.gz“.

  So sichern Sie Discord-Einstellungen unter Linux

Lassen Sie uns Ausführungsberechtigungen für dieses Skript erteilen und es von unserem Home-Verzeichnis aus ausführen.

chmod u+x watch-incoming.sh
./watch-incoming.sh

Öffnen Sie das zweite Terminalfenster und erstellen Sie eine neue Datei im Verzeichnis „incoming“. Listen Sie den Inhalt des Verzeichnisses „incoming“ und „processed“ auf, um die Ergebnisse des erkannten Ereignisses anzuzeigen:

Die Rohtextdatei, die wir in das Verzeichnis „incoming“ kopiert haben, wurde vom Skript erkannt, nach „processed“ kopiert und anschließend mit gzip komprimiert.

Wir können jetzt einige interessante Aufgaben erledigen, da wir in der Lage sind, nach neuen Dateien zu suchen, die in einem Verzeichnis ankommen. Zum Beispiel könnten wir Bilddateien ein Wasserzeichen hinzufügen, Rohvideos in das mp4-Format komprimieren und sogar jede neue Datei, die wir sehen, in einen Amazon S3-Bucket hochladen. Dieses Skript ist ein guter Ausgangspunkt, um eigene Workflows zu erstellen und allgemeine Aufgaben auf Ihrem System zu automatisieren.

x