Verwenden von inotify zum Überwachen eines Verzeichnisses, das jedoch nicht zu 100% funktioniert

10

Ich habe ein Bash-Skript geschrieben, um ein bestimmtes Verzeichnis zu überwachen /root/secondfolder/:

#!/bin/sh

while inotifywait -mr -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

Wenn ich eine Datei mit dem Namen erstellen fourth.txtin /root/secondfolder/und schreiben Sachen, speichern und schließen es, gibt er folgendes:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

"Close_write" wird jedoch nicht wiedergegeben. Warum das?

mib1413456
quelle

Antworten:

16

inotifywait -m ist der "Monitor" -Modus : Er wird nie beendet. Die Shell führt es aus und wartet darauf, dass der Exit-Code weiß, ob der Body der Schleife ausgeführt werden soll, aber das kommt nie.

Wenn Sie entfernen -m, wird es funktionieren:

while inotifywait -r -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

produziert

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/root/secondfolder/ CLOSE_WRITE,CLOSE bar
close_write
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
...

Standardmäßig wird inotifywait "nach dem Eintreten des ersten Ereignisses beendet", was Sie in einer Schleifenbedingung wünschen.


Stattdessen möchten Sie vielleicht lieber die Standardausgabe von lesen inotifywait:

#!/bin/bash

while read line
do
    echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")

Dieses (Bash-) Skript liest jede Ausgabezeile des inotifywaitBefehls $linemithilfe der Prozessersetzung in die Variable innerhalb der Schleife . Es wird vermieden, die rekursiven Uhren jedes Mal um die Schleife herum einzurichten, was teuer sein kann. Wenn Sie bash nicht verwenden können, können Sie den Befehl stattdessen in die Schleife leiten : inotifywait ... | while read line .... inotifywaiterzeugt in diesem Modus für jedes Ereignis eine Ausgabezeile, sodass die Schleife für jedes Ereignis einmal ausgeführt wird.

Michael Homer
quelle
2
Das Weiterleiten des Befehls in die Schleife funktioniert, danke!
mib1413456