Вот пример сценария оболочки, который я пытаюсь реализовать с помощью 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 раз одно за другим?
Они будут запускаться один за другим, если вы не 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
цикл несколько раз подряд, возможно, вы будете ждать весь день.