Kann ein Bash-Skript an eine Datei angehängt werden?

32

Ich möchte, dass ein Skript in den Ruhezustand versetzt wird, es sei denn, eine bestimmte Datei wird geändert / gelöscht (oder eine Datei, die in einem bestimmten Verzeichnis erstellt wurde, oder ...). Kann dies auf elegante Weise erreicht werden? Die einfachste Sache, die mir in den Sinn kommt, ist eine Schleife, die einige Zeit ruht, bevor sie den Status erneut überprüft. Vielleicht gibt es aber auch eine elegantere Möglichkeit.

Tobias Kienzler
quelle

Antworten:

34

Unter Linux können Sie die Kernel- inotifyFunktion verwenden. Dort finden Sie Tools für die Skripterstellung: inotify-tools .

Beispielgebrauch aus Wiki:

#!/bin/sh

EVENT=$(inotifywait --format '%e' ~/file1) # blocking without looping
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'
# etc...
Shellholic
quelle
1
Die meisten Unices haben eine ähnliche Funktion. Leider hat jedes eine eigene Schnittstelle und viele haben keine Shell-API.
Gilles 'SO - hör auf böse zu sein'
4

Es gibt eine API namens inotify für C-Programmierer.

Es gibt einige Tools, die es verwenden, z. B. Incron- und Inotify-Tools .

Mikel
quelle
Großartig, das ist das Zeug. Prost Mikel!
Paul D. Waite
3

In der Tat gibt es: entr (1) führt beliebige Befehle aus, wenn sich Dateien ändern, und bietet auch eine Option zum automatischen Neuladen zum Neustarten von Anwendungsservern.

edit: einige beispiele

Neu erstellen, wenn sich die Quelldateien ändern

$ find *.c | entr make

Starten Sie den Testserver und laden Sie ihn automatisch neu, wenn sich die Dateien ändern

$ ls *.py | entr -r python main.py

Wenn Sie das Agument bereitstellen, +/path/to/fifokönnen Sie komplexere Skripte erstellen, indem Sie entrden Namen jeder Datei schreiben, die sich in eine Named Pipe ändert. Im Folgenden werden Markdown-Dateien im aktuellen Verzeichnis beim Bearbeiten in HTML konvertiert

$ ls *.md | entr +/tmp/notify &
$ while read F
> do
>   markdown2html $F
> done < /tmp/notify
Eradman
quelle
Faszinierend, aber seltsam. Also ... liest es eine Reihe von Dateinamen in der Standardeingabe und führt den angegebenen Befehl aus, wenn sich einer von ihnen ändert?
Tripleee
Sieht interessant aus, danke! Gibt es eine Möglichkeit, entrden Namen der Datei, die sich ebenfalls geändert hat, weiterzugeben?
Tobias Kienzler
Ab Version 2.7 wird das Sonderargument /_(etwas analog zu $_ in Perl) durch den Namen der ersten Datei ersetzt, die sich geändert hat
eradman