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 inotifywait
Befehls $line
mithilfe 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 ...
. inotifywait
erzeugt in diesem Modus für jedes Ereignis eine Ausgabezeile, sodass die Schleife für jedes Ereignis einmal ausgeführt wird.