Connect with us

Wie man

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

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

Fatmawati Achmad Zaenuri/Shutterstock.com

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

Benutzen 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 verwenden ein Tool namens inotifywatch , die Teil von inotify-tools ist. Erstellen Sie ein neues Verzeichnis mit dem Namen „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. Das -v Mit dieser Option druckt das Tool zusätzliche Informationen zu seinen Aktionen aus. Wir haben keine Timeout-Option angegeben (-t ), und der Befehl sammelt weiterhin Ereignisse, bis wir mit STRG+C beenden. An dieser Stelle sollte unser Terminal ungefähr so ​​aussehen:

Öffnen Sie ein neues Terminalfenster (oder Tab) und wechseln Sie in das Eingangsverzeichnis. 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 dann die Datei 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:

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, welchen Ereignissen wir folgen müssen, können wir ein weiteres Tool namens . verwenden inotifywait um die Ausführung zu blockieren, bis eine Datei in unserem Zielverzeichnis erstellt oder dorthin verschoben wird. Wir verwenden die gleichen 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 die inotifywait Befehl mit dem -m Möglichkeit. 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. Der Block unter der while-Schleife wird ausgeführt, in dem die Datei zunächst in das Verzeichnis „processed“ verschoben und anschließend mit gzippt wird. Die Originaldatei wird durch die komprimierte Datei ersetzt und der Dateiname endet auf „.gz“.

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.

Continue Reading
Click to comment

Leave a Reply

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

Tendencia