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

18

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

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

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

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

BlackScorp
источник

Ответы:

18

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

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

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

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

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

Оли
источник
1
ну проблема кажется, что inotify не умеет проверять общие папки nfs. чтобы убедиться, что я хочу, попробуйте описать, что у меня установлена ​​виртуальная коробка с vagrant, там у меня есть общая папка "projects", она монтируется при загрузке, все файлы моего веб-сервера находятся там, чтобы я мог изменить их на своем хосте Система (win7), как я уже говорил, общие папки виртуального ящика работают очень медленно, поэтому решением может быть синхронизация смонтированной папки nfs в другое место, например / var / www, но общие способы не работают, я попробовал обмен файлами, icrontab, gues gamin или Fam поможет, но я не знаю, как их запустить или использовать
BlackScorp
@ BlackScorp реально вы застряли с помощью cronning rsync и позволяете ему решать, что нужно синхронизировать. Как я привел в ответе, это не очень плохой вариант.
Оли
1
Другой вариант - отправлять файлы с хоста, а не пытаться обнаруживать изменения удаленно.
Оли
Что ж, это решение, которое я использовал ранее, имеет 2 проблемы: 1) мне приходилось каждый раз заново подключаться к своему виртуальному ящику для редактирования файлов, а это значит, что мой виртуальный компьютер должен работать, быстрое редактирование больше не работает 2) я не знаю почему, но потому что процесса сканирования проекта в моей IDE (Netbeans) samba показывает 99% загрузки ЦП и все в виртуальной коробке просто медленное во время разработки, я попробую решение rsyn + cronjob или сборку php в веб-сервере
BlackScorp
inotifywaitРешение имеет один небольшой , но существенный недостаток: он не обнаруживает изменения , которые произошли , когда rsyncработают. Рассмотрим следующую ситуацию: файл A изменен; rsync срабатывает; когда rsync почти завершил синхронизацию файла A, файл B изменяется. Теперь он rsyncзакончен и inotifywaitработает, но файл B не синхронизирован и не будет синхронизирован до следующего изменения. Попробуйте использоватьlsyncd как предложено @Arigion.
MarSoft
6

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

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

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

Arigion
источник
2

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

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done
silgon
источник
Это не обнаружит изменений, произошедших во время работы rsync. Попробуйте использовать lsyncdкак предложено @Arigion.
MarSoft
это будет повторно применять все события ко всем файлам после каждого изменения ... и когда оно применяется, оно не увидит никаких изменений в этот период ...
Кто-то
0

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

Робин Мачарг
источник