Menggunakan inotify untuk memonitor direktori tetapi tidak berfungsi 100%

10

Saya telah menulis skrip bash untuk memantau direktori tertentu /root/secondfolder/:

#!/bin/sh

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

Ketika saya membuat sebuah file yang bernama fourth.txtdalam /root/secondfolder/dan menulis hal-hal itu, menyimpan dan dekat itu, itu output berikut:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

Namun, itu tidak menggemakan "close_write". Mengapa demikian?

mib1413456
sumber

Jawaban:

16

inotifywait -m adalah mode "monitor" : tidak pernah keluar. Shell menjalankannya dan menunggu kode keluar untuk mengetahui apakah akan menjalankan tubuh loop, tetapi itu tidak pernah datang.

Jika Anda menghapus -m, itu akan berhasil:

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

menghasilkan

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.
...

Secara default, inotifywait akan "keluar setelah peristiwa pertama terjadi", yang Anda inginkan dalam kondisi loop.


Sebagai gantinya, Anda mungkin lebih suka membaca output standar inotifywait:

#!/bin/bash

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

Skrip (bash) ini akan membaca setiap baris output dari inotifywaitperintah ke dalam $linevariabel di dalam loop, menggunakan proses substitusi . Ini menghindari pengaturan jam tangan rekursif setiap kali di loop, yang mungkin mahal. Jika Anda tidak dapat menggunakan bash, Anda dapat pipa perintah ke loop sebagai gantinya: inotifywait ... | while read line .... inotifywaitmenghasilkan satu garis output untuk setiap peristiwa dalam mode ini, sehingga loop berjalan satu kali untuk masing-masing.

Michael Homer
sumber
2
Memipakan perintah ke loop berfungsi, terima kasih!
mib1413456