Назад | Перейти на главную страницу

Вопрос по поводу 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 раз одно за другим?

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