Вопрос про inotifywait

Вот пример сценария оболочки, который я смотрю на реализацию с использованием inotify:

inotifywait -mrq -e close_write -e create -e delete -e move /var/www | while read file;
do   
    rsync -av /var/www1/ /var/www2/  
done

Допустим, rsync занимает 30 секунд.

Если в течение 5 секунд будет 10 событий inotify, будут ли 10 процессов rsync одновременно выполнять одно и то же задание?

ИЛИ ЖЕ

Будет ли только одно задание rsync, которое будет выполнено 10 раз, одно за другим?

1 ответ

Они будут запускаться один за другим, если вы не rsync с & в конце.

Это запустит их одновременно, а это не то, что вы хотите:

inotifywait -mrq -e close_write -e create -e delete -e move /var/www | while read file
do   
    rsync -av /var/www1/ /var/www2/  &
done

Вы, вероятно, также не хотите, чтобы он запускался десять раз подряд. Это может быть то, что вы после:

while inotifywait -rq -e close_write -e create -e delete -e move /var/www
do   
    rsync -av /var/www1/ /var/www2/  
done

Также имейте в виду, что работает inotifywait рекурсивно на большом /var/www может потребоваться некоторое время для настройки на каждый вызов. Вы можете захотеть ограничить его область только просмотром активных подкаталогов или просто использовать cron периодически бегать rsync,

Редактировать:

Попробуйте это демо:

$ mkdir inotifytest
$ cd inotifytest
$ echo something > testfile
$ while inotifywait -rq -e access .; do echo "processing"; sleep 3; done    # test 1

Теперь в другом терминале сделайте это:

$ cd inotifytest
$ for i in {1..10}; do cat testfile > /dev/null; done

В первом терминале вы должны увидеть "обработку" один раз. Если вы делаете for/cat цикл (который представляет файлы, добавляемые или удаляемые в ваших каталогах) снова, вы увидите это снова.

Теперь в первом терминале прервите цикл с помощью Ctrl-C и запустите этот цикл:

$ inotifywait -mrq -e access .| while read file; do echo "processing"; sleep 3; done    # test 2

Во втором терминале запустите for/cat цикл снова На этот раз в первом терминале вы увидите "обработку" десять раз с трехсекундной паузой между каждым (представляя время, которое требуется rsync завершить. Теперь, если вы должны были запустить for Зацикливайтесь несколько раз в быстрой последовательности, вы можете ждать весь день.

Другие вопросы по тегам