it-swarm.com.de

Bash-Skript zur Überwachung von Dateiänderungen und zur Ausführung von Befehlen

Ich habe einen Ordner mit einer Reihe von Unterordnern. Diese Ordner haben das Format asciidoctor und die Erweiterung .adoc.

Jedes Mal, wenn ich Änderungen an Dateien vorgenommen habe (was häufig der Fall ist), muss ich ausführen

asciidoctor -q filename.adoc

um es im HTML-Format zu kompilieren.

Ich versuche, den Prozess zu automatisieren. Bisher bin ich mit entr damit gekommen:

ls *.adoc | entr asciidoctor -q *.adoc

funktioniert aber nur mit vorhandenen ordnern nicht für unterordner. Ich habe diese Variante ausprobiert, aber sie funktioniert nicht:

find . -name '*.adoc' | entr asciidoctor -q *.adoc

Irgendwelche Ideen, wie ich diesen Automatisierungsprozess für alle Unterordner implementieren könnte?

10
bran

Linux bietet eine nette Oberfläche für die Überwachung aller Dateisystemereignisse wie das Erstellen, Ändern und Entfernen von Dateien. Die Schnittstelle ist die inotify Familie von Systemaufrufen. Die Userspace-Dienstprogramme, die diese Aufrufe nutzen, werden vom inotify-tools-Paket in Ubuntu bereitgestellt (im Universums-Repository verfügbar). Wenn Sie es noch nicht haben, installieren Sie es mit:

Sudo apt-get install inotify-tools

inotify-tools bietet inotifywait und inotifywatch Binärdateien, wir brauchen die erste.


Sie möchten also den Befehl asciidoctor -q some_file ausführen, wenn eine .adoc-Datei geändert wird (some_file wird dadurch ersetzt). Wenn Sie also davon ausgehen, dass sich Ihre .adoc-Dateien im Verzeichnis /foo/bar befinden, können Sie die Überwachung einstellen:

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
  • -q aktiviert den stillen Modus, keine Informationen von inotifywait selbst

  • -m aktiviert den Überwachungsmodus, andernfalls wird er nach dem ersten Ereignis beendet

  • --event modify, wir sind nur am modify -Ereignis interessiert, d. h. wenn eine Datei geändert wird. Andere mögliche Werte sind open, close usw.

  • --format %w, wir wollen nur den Dateinamen, der geändert wird, und nicht eine Menge anderer Informationen, da wir den Dateinamen als Eingabe für einen anderen Befehl verwenden

  • /foo/bar/*.adoc wird auf alle .adoc-Dateien im Verzeichnis /foo/bar erweitert


Jetzt zeigt Ihnen das Obige den Dateinamen, wann immer einer geändert wird, um den Befehl für den Dateinamen auszuführen (vorausgesetzt, der Befehl nimmt Argumente über STDIN an):

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc | asciidoctor -q

Sie können auch eine rekursive Überwachung für das Verzeichnis einrichten. Anschließend müssen Sie grep verwenden, um nur die gewünschten Dateien zu filtern. Hier wird die Uhr rekursiv (-r) auf das Verzeichnis /foo/bar gesetzt und grep verwendet, um nur .adoc-Dateien zu filtern:

inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | asciidoctor -q

Beim Überwachen von Verzeichnissen wird der Ausgabeformat-Bezeichner %w in den Verzeichnisnamen aufgelöst. Daher benötigen wir %f, um den Dateinamen abzurufen. Beim Ansehen von Dateien wird %f in eine leere Zeichenfolge aufgelöst.

Beachten Sie, dass Sie inotifywait auch im Daemon-Modus (-d) ausführen können, das Ganze auch skripten und/oder im Hintergrund ausführen können und/oder mit anderen Optionen spielen können.

Sie können asciidoctor auch durch einen beliebigen anderen Befehl Ihrer Wahl ersetzen.

Überprüfen Sie man inotifywait, um weitere Informationen zu erhalten.

14
heemayl

Die Verwendung von inotifywait ist der typische Ansatz, es gibt jedoch auch ein separates Hilfsprogramm namens inotify-hookable, mit dem Sie nur einen Befehl ausführen können, wenn sich eine Datei (oder ein Verzeichnis) ändert:

inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'

Es scheint zu beenden, nachdem der Befehl einmal ausgelöst wurde. Ich sehe keine Option für kontinuierliches Anschauen, daher können Sie Folgendes tun:

while true; do
    inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'
    echo "== $(date) : executed, continuing to monitor..."
done

Beachten Sie, dass es Optionen zum rekursiven Überwachen mehrerer Dateien oder eines Verzeichnisses sowie Optionen zum Ignorieren von Dateien/Pfaden gibt.

3
michael

Es gibt viele Tools, insbesondere, wenn Sie Ihr Repository durchsuchen

apt-cache search monitor | grep file

das gibt uns viele Werkzeuge. Aber Sie müssen sie nicht testen, weil ich das getan habe.

Ich habe diese Tools und viele andere getestet:

  • inotifizieren
  • fswatch
  • filewatch
  • swatch
  • datei geändert
  • entr

Unter diesen Werkzeugen fanden ich drei nützlich und zuverlässig:

  • direvent | GNU geschrieben in C
  • iWatch | in Perl
  • fsniper

Und zwischen diesen drei ist das direvent zweifellos das beste.

Es ist so nützlich und zuverlässig, dass ich es für eine einfache - Pipeline mit meinen Microservices verwendet habe.

direvent.conf Datei zum Ansehen

syslog {
    facility local0;
    tag "direvent";
    print-priority yes;
}

watcher {
    path /var/www/html/ir/jsfun/build/react recursive;
    file "*.js";
    event write;
    command "/usr/bin/xdotool search --onlyvisible  --class firefox key F5";
    option (stdout, stderr, wait);
}

Dies ist nur eine der Konfigurationsdateien, in denen bei jeder Änderung von write dieser Befehl ausgeführt wird - dies könnte eine bash sein Skript auch.

Es ist nicht erforderlich, eine while -Schleife oder andere Dinge zu verwenden.


eigenschaften

  • rekursives Beobachten eines Verzeichnisses
  • kann in Vordergrund oder Hintergrund als Daemon ausgeführt werden
  • tragbar. Ich habe es in Ubuntu sowie CentOS7 Server
  • dateinamenbericht
  • regex zur Unterstützung des Dateiabgleichs
  • mulit-Dateiüberwachung (mehr als nur einen Dateityp überwachen)
  • ausführung von Befehlen synchronisieren (wenn wir Multi-Watcher haben)
  • syslog handling (log in syslog wenn wir wollen)
  • einfaches und gutes Design von CLI- und Konfigurationsdateien

Entwickelt von Sergey Poznyakoff .


Installieren

Sudo apt install direvent

Die Installation über den Quellcode ist jedoch recht einfach und unkompliziert, sodass Sie die letzte Version erhalten (im Moment: 5.1).

1
Shakiba Moshiri