Как запустить rsync при изменении файла?

Я могу синхронизировать папки с rsync -avz /directory /target, теперь я хочу это сделать, если я изменил файл в /directory, поэтому rsync должен вызываться автоматически.

Я использую Virtual Box, и общая папка Virtual Box работает очень медленно, особенно если у вас есть веб-страница, которая использует общую папку в качестве корня документа. С помощью rsync я смогу работать с моими локальными файлами в общей папке и автоматически синхронизировать их с корнем документа.

Я надеюсь, что у кого-то есть идея, как это сделать, crontab было бы нехорошо, потому что оно выполняется каждые x минут, поэтому, если я ничего не буду делать, он все равно вызовет rsync, но не если я изменил мой файл.

С наилучшими пожеланиями

18
задан 30 August 2013 в 14:19

4 ответа

Вы можете использовать Lsyncd (Live Syncing Daemon) :

Lsyncd отслеживает интерфейс монитора событий локальных деревьев каталогов (inotify или fsevents). Он объединяет и объединяет события в течение нескольких секунд, а затем запускает один (или более) процесс (ы) для синхронизации изменений. По умолчанию это rsync. Таким образом, Lsyncd - это легкое решение для живого зеркала, которое сравнительно легко установить, не требующее новых файловых систем или блочных устройств, и не снижающее производительность локальной файловой системы.

Вот, например, учебник для Ubuntu 16.04 .

0
ответ дан 30 August 2013 в 14:19

Немного расширив комментарий к принятому ответу, я успешно использовал fswatch , чтобы вызвать scp измененных файлов для гостя. В Linux это обертка вокруг inotify, но она также кроссплатформенная (я на Mac с гостевым гостем QEMU на базе Arm). Я также использовал удаленную сборку ssh. Пуш-подход хорошо работает с акциями, которые ведут себя не совсем идеально.

0
ответ дан 30 August 2013 в 14:19

Вы можете использовать inotifywait и rsync. inotifywait с включенным событием modify,create,delete. Таким образом, вы будете синхронизироваться с вашим сервером только при изменении файла, в противном случае он будет синхронизироваться при каждом чтении файла (редакторы несколько раз читают ваш файл, чтобы проверить, есть ли какие-либо изменения). Так сказал:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done
0
ответ дан 30 August 2013 в 14:19

crontab не годится, потому что он выполняется каждые x секунд / минут, поэтому, если я ничего не буду делать, он все равно будет вызывать rsync, но не будет, если я изменил мой файл

rsync будет синхронизировать только файлы, которые были изменены. Если ничего не изменилось, оно выйдет. Это действительно минимальные накладные расходы.

Если вы недовольны этим, вы можете использовать inotifywait:

while inotifywait -r /directory/*; do
    rsync -avz /directory /target
done

Это будет более мгновенно, но оно будет действовать каждый раз, когда вы сохраняете.

0
ответ дан 30 August 2013 в 14:19

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

Похожие вопросы: