Wie, um eine Aufgabe Auszuführen, Wenn eine Neue Datei Hinzugefügt, um ein Verzeichnis in Linux

0
462
Fatmawati Achmad Zaenuri/Shutterstock.com

Dieses tutorial wird Ihnen zeigen, wie Sie mit Linux filesystem events (notify), um benachrichtigt zu werden, jedes mal, wenn eine Datei wird in ein Verzeichnis. Könnten Sie diese als Auslöser zu automatisieren häufige Aufgaben auf Ihrem system.

Wir werden ein Skript schreiben, dass die Uhren ein Verzeichnis und wirkt auf neue Dateien Hinzugefügt werden. Jede Datei ist gzipped und in ein anderes Verzeichnis verschoben, sobald er erkannt ist. Das Skript verwendet die inotify-subsystem, das über ein Dienstprogramm namens ” inotify-tools. Aber lassen Sie uns zuerst das tool installieren und zu Experimentieren.

Die Installation von inotify-tools und gzip

Die Verwendung von apt-get zu installieren Sie dieses Paket auf Ihrem system, wenn Sie Ubuntu oder eine andere Debian-basierte distribution. Auf anderen Linux-Distributionen, verwenden Sie Ihre Linux-distribution Paket-management-tool statt.

sudo apt-get install inotify-tools gzip

Das Experimentieren mit inotify-tools

Lassen Sie uns beginnen, indem Sie gerade ein Verzeichnis und sehen, welche Veranstaltungen initiieren, wenn neue Dateien ankommen. Wir verwenden ein tool namens inotifywatch , die Teil der inotify-tools. Erstellen Sie ein neues Verzeichnis namens “incoming”:

mkdir incoming

Starten Sie in diesem Verzeichnis, indem Sie den folgenden Befehl ausführen:

inotifywatch -v eingehende

Dieser wird Sie anweisen, inotify zu beobachten, für alle Dateisystem-events in den “incoming” – Verzeichnis. Die -v option macht das tool drucken Sie zusätzliche Informationen über das, was es tut. Wir noch nicht angegeben, eine timeout-option (-t ), und der Befehl wird halten, sammeln Ereignisse, bis wir beenden mit STRG+C. An dieser Stelle unser terminal sollte in etwa so Aussehen:

Öffnen Sie ein neues terminal-Fenster (oder tab) und wechseln Sie in das incoming-Verzeichnis. Verwenden Sie den Befehl touch eine neue Datei erstellen mit dem Namen “neuedatei.”

cd-eingehende/
touch newfile

Jetzt gehen Sie zurück zu der ersten terminal-Fenster und stoppen inotifywatch durch drücken von STRG+C.

Eine Tabelle der Ereignisse bedient wird die Konsole, die angibt, mit der eine Instanz “erstellen,” “offen,” “attrib” und “close_write.” Diese vier Ereignisse aufgetreten, wenn wir touch eine neue Datei zu erstellen, legen Sie Ihre Datei auf die Attribute zuzugreifen, öffnete Sie schreiben ein null-Endzeichen, und dann Schloss es wieder. Dies sind nur ein paar der Vielzahl der Ereignisse, die überwacht werden können, auf einem Dateisystem mit inotify-tools. Sie können die vollständige Liste auf der Hauptseite für inotifywatch.

Für unsere Zwecke werden wir nur an zwei Ereignisse:

  • “erstellen” – wenn eine Datei erstellt wird, in das Ziel-Verzeichnis.
  • “moved_to” – wenn eine Datei verschoben wird, von einem anderen Standort aus in das Ziel-Verzeichnis.

Lassen Sie uns versuchen inotifywatch wieder, aber dieses mal anweisen, es zu überwachen, diese beiden Ereignisse nur. Führen Sie diesen Befehl in der ersten terminal-Fenster:

inotifywatch -v -e erstellen -e moved_to eingehende

In der zweiten terminal-Fenster oder tab, lassen Sie uns versuchen, eine neue Datei erstellen, den Inhalt zu verändern, und dann verschieben Sie die Datei von einem anderen Speicherort in das Zielverzeichnis. Alle diese Befehle werden ausgeführt, aus dem home-Verzeichnis.

touch incoming/erstellt
echo Testing123 >> eingehende/erstellt
touch /tmp/created2
mv /tmp/created2 eingehende/

Gehen Sie zurück zu der ersten terminal-Fenster und stoppen inotifywatch durch drücken von STRG+C. Wir werden die folgende Ausgabe angezeigt werden:

Nur zwei Ereignisse gezählt wurden: das erstellen einer Datei namens “created.txt” und bewegen Sie eine vorhandene Datei namens “created2.txt”. Alles andere, wie das ändern “created.txt” wurde ignoriert.

Beobachten Sie ein Verzeichnis, und die Aufgabe Ausgeführt wird

Jetzt, da wir wissen, welche Ereignisse zu Folgen, können wir ein weiteres tool namens inotifywait auf block-Ausführung, bis eine Datei erstellt oder verschoben werden, um unser Ziel-Verzeichnis. Wir verwenden die gleichen Argumente wie wir mit inotifywatch und auch angeben, wie wollen wir das mit dem Namen formatiert werden für den Einsatz in unserer Aufgabe.

Bevor wir beginnen, müssen wir ein Verzeichnis für Dateien, die bereits verarbeitet wurden. Erstellen Sie ein Verzeichnis namens “verarbeitet”:

mkdir verarbeitet

Als Nächstes erstellen Sie ein neues Skript mit dem Namen “watch-incoming.sh” und fügen Sie die unten aufgeführten Inhalte:

#!/bin/bash

ZIEL=~/incoming/
VERARBEITET=~/verarbeitet/

inotifywait -m -e erstellen -e moved_to –format “%f” $TARGET
| while read FILENAME
tun
echo Erkannt $FILENAME, verschieben und komprimieren
mv “$TARGET/$FILENAME” “$VERARBEITET/$FILENAME”
gzip “$VERARBEITET/$FILENAME”
getan

Das script führt den Befehl inotifywait mit der-m option. Dies macht der Befehl überwachen von änderungen auf unbestimmte Zeit. Jedes mal, wenn ein neues Ereignis erkannt wird, wird der Dateiname übergeben, der read-Befehl und injiziert in die “DATEINAME” – variable. Der block unter der while-Schleife ausgeführt wird, in dem die Datei zum ersten mal bewegt, um die “verarbeitet” – Verzeichnis und dann gzipped. Die original-Datei ersetzt wird, mit der komprimierten Datei und der Dateiname endet auf “.gz”.

Let ‘ s grant execute-Berechtigungen für dieses Skript und führen Sie es aus unserem home-Verzeichnis.

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

Öffnen Sie das zweite terminal-Fenster, und erstellen Sie eine neue Datei in dem “incoming” – Verzeichnis. Liste den Inhalt der “incoming” – und “verarbeitet” – Verzeichnis zu sehen, die Ergebnisse der Ereignis erkannt wird:

Die raw-text-Datei, die wir kopiert und in die “incoming” – Verzeichnis vom Skript erkannt, kopiert und in “bearbeitet” und dann mit gzip komprimiert.

Wir können einige interessante Aufgaben nun, dass wir in der Lage zu sehen, die für neue Dateien ankommen, in einem Verzeichnis. Zum Beispiel könnte das hinzufügen von Wasserzeichen in Bild-Dateien, komprimieren von raw-videos in das mp4-format und sogar hochladen, jede neue Datei, die wir sehen, zu einem Amazon S3-bucket. Dieses Skript ist ein guter Ausgangspunkt für Ihre eigenen Rollen-workflows und die Automatisierung gängiger Aufgaben auf Ihrem system.