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?

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.


2
Das Weiterleiten des Befehls in die Schleife funktioniert, danke!
mib1413456
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.