Використання ініціації для моніторингу каталогу, але не працює на 100%


10

Я написав сценарій bash для моніторингу конкретного каталогу /root/secondfolder/:

#!/bin/sh

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

Коли я створюю файл з ім'ям fourth.txtв /root/secondfolder/і писати матеріал до нього, збережіть і закрийте його, він видає наступне:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

Однак це не лунає "close_write". Чому так?

Відповіді:


16

inotifywait -m це режим "монітор" : він ніколи не вимикається. Оболонка запускає її і чекає коду виходу, щоб знати, чи запускати тіло циклу, але це ніколи не настає.

Якщо ви видалите -m, він буде працювати:

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

виробляє

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

За замовчуванням, inotifywait "вийде після того, як відбудеться перша подія", що вам потрібно в умовах циклу.


Натомість ви можете скористатись читанням стандартного виводу inotifywait:

#!/bin/bash

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

Цей (bash) скрипт буде читати кожен вихідний рядок inotifywaitкоманди у $lineзмінну всередині циклу, використовуючи підстановку процесу . Це дозволяє уникнути налаштування рекурсивних годин кожного разу навколо циклу, що може бути дорого. Якщо ви не можете використовувати Баш, ви можете труби команди в петлю замість: inotifywait ... | while read line .... inotifywaitстворює один рядок виводу для кожної події в цьому режимі, тому цикл працює один раз для кожного.


2
Передача команди в цикл працює, дякую!
mib1413456
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.