Як зберегти автоматичну синхронізацію двох папок?


87

Я хотів би мати синхронізовану копію однієї папки з усім її піддеревом.

Це повинно працювати автоматично таким чином: кожного разу, коли я створюю, модифікую або видаляю матеріали з вихідної папки, ці зміни слід автоматично застосовувати до папки синхронізації.

Який найкращий підхід до цього завдання?

До речі: я на Ubuntu 12.04

Кінцева мета - мати відокремлену резервну копію в режимі реального часу, без використання символічних посилань або монтування. Я використовував Ubuntu One для синхронізації даних між комп’ютерами, і через деякий час щось пішло не так, і всі мої дані були втрачені під час синхронізації.

Тому я подумав додати ще один крок, щоб зберегти резервну копію своїх даних:

  • Я зберігаю свої дані у «папці А»
  • Мені потрібна відповідь на моє поточне запитання, щоб створити односторонню синхронізацію "папки A" з "папкою B" ( cronсценарій з rsync? Може бути?). Мені потрібно, щоб він був одностороннім лише від А до В, будь-які зміни до В не повинні застосовуватися до А.
  • Я просто продовжую синхронізувати "папку B" з Ubuntu One.

    Таким чином, будь-які зміни в A будуть застосовані до B, які будуть виявлені з U1 та синхронізовані з хмарою. Якщо щось піде не так, і U1 видалить мої дані на B, я завжди маю їх на A.

Натхненною коментарями lanzz, ще однією ідеєю може бути запуск rsync під час запуску для резервного копіювання вмісту папки під Ubuntu One та запуск Ubuntu One лише після завершення rsync.

Що ти думаєш про це? Як дізнатися, коли закінчується rsync?


Що ви намагаєтесь досягти? Чи справді папки мають бути відокремленими, чи не можете ви символічно зв’язати одне ім’я з іншим або прив’язати-змонтувати каталог до вторинного місця? Крім того, погляньте на ці результати пошуку .
lanzz

1
Я б порадив проти фактичної живої синхронізації (тобто безперервно стежить за змінами файлів у вихідному каталозі) на користь періодичної rsyncчерез хрон.
lanzz

Відповіді:


100

Ви можете використовувати inotifywaitmodify,create,delete,moveувімкненими прапорами) і rsync.

while inotifywait -r -e modify,create,delete,move /directory; do
    rsync -avz /directory /target
done

Якщо у вас немає inotifywaitсистеми, запустітьsudo apt-get install inotify-tools


3
Ви могли б хотіти розглянути , щоб додати -e ssh user@remote:/targetдо , rsyncякщо ви хочете використовувати SSH в якості транспорту для доступу до віддаленої машині.
Сокіл

2
Дякую @Falcon, я зазвичай використовую rsync -avz --delete --exclude-from=.rsyncignore /directory user@server:path. Однак я хотів написати просту відповідь.
silgon 15.03.18

4
для уточнення: це одноразова річ, чи ви могли б додати це до bashrc чи щось інше?
Бред Джонсон,

1
Ви можете розглядати весь цикл while як процес, який синхронізується за потреби. Зазвичай я додаю його до Makefile проекту, над яким працюю. Таким чином я можу вибрати сервер і каталог, який я хочу, щоб він був збережений. Один із моїх випадків використання - це те, коли я програмую алгоритми глибокого навчання на своєму ноутбуці, і я синхронізую їх для виконання важких процесів на спеціальному комп’ютері з кращими процесором та графічним процесором. Я також виключаю непотрібні мені файли, наприклад .gitпапку.
silgon

2
Це не обробляє перейменування файлів, використовуйтеmodify,create,delete,move
urusha

24

Вам потрібно щось на зразок цього: https://github.com/axkibe/lsyncd Це інструмент, що поєднує rsync та inotify - перший - це інструмент, який відображає, з правильними наборами параметрів, каталог до останнього біта. Останнє повідомляє ядру повідомляти програму про зміни у файлі каталогу. Він говорить:

Він об'єднує та поєднує події протягом декількох секунд, а потім породжує один (або більше) процесів, щоб синхронізувати зміни.

Але - за даними Digital Ocean на https://www.digitalocean.com/community/tutorials/how-to-mirror-local-and-remote-directories-on-a-vps-with-lsyncd - це повинно бути в сховище Ubuntu!

У мене є подібні вимоги, і цей інструмент, який я ще не спробував, здається придатним для цього завдання.


1
Спочатку lsyncd здавався срібною кулею, але у нього є багато відкритих питань, і, мабуть, реалізація macOS "стара і застаріла". Я не зміг змусити його працювати 10.12.
платний ботанік

@apaidnerd Чесно кажучи, відкрито 90 випусків проти 420 закритих. Однак за останній рік було закрито лише 10/40 номерів.
Mateen Ulhaq

8

Просто проста модифікація відповіді @silgon:

while true; do 
  inotifywait -r -e modify,create,delete /directory
  rsync -avz /directory /target
done

(версія @silgon іноді аварійно завершує роботу на Ubuntu 16, якщо ви запускаєте її в cron)


2
Чому ви запускаєте це в cron?
saygley

@saygley Для конкретного завдання після перезавантаження Ubuntu процес синхронізації повинен запускатися автоматично
Денис Кузін

5
Я розумію .. Тим не менше, оскільки це зазвичай слід запускати один раз і працювати до тих пір, поки сервер працює; Натомість я б розглянув щось вкладене в rc.local.
saygley

2

Ви можете скористатися fschange . Це сповіщення про зміну файлової системи Linux. Вихідний код можна завантажити з наведеного вище посилання, ви можете скомпілювати його самостійно. fschangeможе використовуватися для відстеження змін у файлі шляхом зчитування даних із файлу proc (/ proc / fschange). Коли дані записуються у файл, fschange повідомляє точний інтервал, який був змінений, замість того, щоб просто сказати, що файл змінено. Якщо ви шукаєте більш досконале рішення, я пропоную перевірити Resilio Connect . Він є міжплатформеним, надає розширені можливості для використання та моніторингу. Оскільки він заснований на BitTorrent, це швидше, ніж будь-який інший існуючий інструмент синхронізації. Це було написано від їх імені.


0

Я використовую цю безкоштовну програму для синхронізації локальних файлів та каталогів: https://github.com/Fitus/Zaloha.sh . Сховище також містить просту демонстраційну версію.

Хороший момент: Це сценарій оболонки bash (лише один файл). Не чорний ящик, як інші програми. Документація також є. Крім того, маючи деякі технічні таланти, ви можете "зігнути" та "інтегрувати" його, щоб створити остаточне рішення, яке вам подобається.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.