Вопрос про 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
Зацикливайтесь несколько раз в быстрой последовательности, вы можете ждать весь день.