Програмне забезпечення для синхронізації двох каталогів (локальний / віддалений)


9

Мені потрібне програмне забезпечення, яке б виявляло зміни в каталозі (A) кожні 5 секунд або близько того і завантажувало / видаляло змінені файли з віддаленого каталогу / at (B).

Я знайшов некомерційне програмне забезпечення https://github.com/devstructure/doubledown . Цікаво, чи є комерційні альтернативи?

Відповіді:


12

rsync , безумовно, є правильним інструментом для цієї роботи. Він існує для того, щоб синхронізувати каталоги синхронізовано, і це можна зробити з досить розумними. Наприклад: він передаватиме лише дельти, коли тільки може, і може працювати над ssh-тунелями.

Скажімо, у вас є джерело машини, яке розміщує вашу живу версію дерева каталогів /my/treeта раковину машини, яку ви хочете підтримувати з нею тісною синхронізацією. Якщо у вас був обліковий запис ssh на раковині, ви могли з джерела використовувати rsync таким чином:

rsync -avz --delete -e ssh /my/tree/ remoteuser@sink:/my/tree

Це передбачає, що ви хочете /my/treeв точно такому ж місці на раковині, як і у джерелі . Звичайно, не потрібно тримати його в точно такому ж місці.

Розбивка командного рядка:

  • -avz: архівний режим, багатослівний вихід, використання стиснення під час передачі
  • --delete: видалити файли під час синхронізації , які відсутні у вихідному коді
  • -e ssh: Використовуйте ssh як метод з'єднання

Цей дзвінок, звичайно, запитає вас про пароль, коли ви його здійснюєте. Якщо ви хочете зробити це автоматичним способом, вам потрібно буде поділитися деякими ключами між обліковими записами на машинах і використовувати шифрування публічно-приватного ключа для створення ssh-з'єднання.

Щоб налаштувати свою пару ключів для цього rysnc, запустіть таку команду на своїй вихідній машині:

> ssh-keygen -t rsa -b 2048 -f ~/.ssh/my-rsync-key 
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): [press enter here] 
Enter same passphrase again: [press enter here] 
Your identification has been saved in ~/.ssh/my-rsync-key. 
Your public key has been saved in ~/.ssh/my-rsync-key.pub. 
The key fingerprint is: 
2e:28:d9:ec:85:21:e7:ff:73:df:2e:07:78:f0:d0:a0 root@source

> chmod 600 ~/.ssh/my-rsync-key

Щоб ця кнопкова робота працювала, нам потрібно додати вміст файлу ~/.ssh/my-rsync-key.pubдо ~<remoteuser>/.ssh/authorized_keysфайлу на раковині .

Спочатку скопіюйте файл на машину мийки :

scp ~/.ssh/my-rsync-key.pub remoteuser@sink:~

Потім ssh на машину мийки та імпортуйте ключ, запустивши на пристрої наступне в якості віддаленогокористувача :

> if [ ! -d ~/.ssh ]; then mkdir ~/.ssh ; chmod 700 ~/.ssh ; fi
cd ~/.ssh/ 
if [ ! -f authorized_keys ]; then touch authorized_keys ; chmod 600 authorized_keys ; fi 
cat ~/my-rsync-key.pub >> authorized_keys
rm ~/my-rsync-key.pub

Додаткові поради з блокування з'єднання SSH між вашим джерелом і мийкою машинами я рекомендую подивитися на цій сторінці .

На вашій вихідній машині ви можете перевірити, що ця установка працює, запустивши:

rsync -avz --dry-run -e "ssh -i ~/.ssh/my-rsync-key" /my/tree/ remoteuser@sink:/my/tree

Це зробить сухий цикл rsync. Якщо ви бачите команду rsync, що з'єднує та порівнює файли, ви знаєте, що налаштування налаштовано належним чином.

Тепер нам потрібен простий спосіб викликати цю команду rsync з конфігураційного файла LaunchD, як показано в цій корисній відповіді на цьому сайті . Оскільки ви хочете, щоб цей дзвінок відбувався в тісному циклі, вам потрібно буде переконатися, що у вас немає декількох копій rsync, що працює одночасно. Ви можете використовувати flock для створення файлу mutex, який забезпечує, що bash-скрипт є однотонним: лише один екземпляр його запускається одночасно на машині. Отже, ми збираємось створити наступний скрипт на диску:

#!/bin/sh
SINK_INSTANCE=remoteuser@sink
DIR=/my/tree
KEY=~/.ssh/my-rsync-key
LOG = ~/my_rsync.log
LOCK = ~/my_rsync.lock
SOURCE=/my/tree

exec 9>${LOCK}
if ! flock -n 9  ; then
    echo "Another instance of your rsync is already running";
    exit 1
fi

echo "----------" >> ${LOG}
echo `date` >> ${LOG}

rsync -avz --delete -e "ssh -i ${KEY}" \
    ${SOURCE}/ {SINK_INSTANCE}:${SOURCE} 2>&1 >> ${LOG}

Збережіть це як ~/my_rsync.sh.

Цей сценарій піклується про те, щоб зробити rsync для вас. Все, що вам потрібно зробити зараз, це налаштувати його за допомогою LaunchD і запустити його в тісний цикл. Виконуючи вказівки звідси та змінюючи його, щоб відповідати нашим потребам, ми збираємось створити ~/Library/LaunchAgents/my-rsync.plistтекстовий редактор і зробити вміст:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>My Rsync</string>
    <key>Program</key>
    <string>/bin/sh</string>
    <key>ProgramArguments</key>
    <array>
        <string>sh</string>
        <string>-c</string>
        <string>while sleep 5s; /Users/my/my_rsync.sh; done</string>
    </array>
    <key>ServiceDescription</key>
    <string>Keep /my/tree synchronized with the machine sink</string>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

Це має подбати про речі.

Застосовуються звичайні застереження: я написав це з пам'яті і не перевіряв. Тому не слідкуйте сліпо. Тестуйте ретельно по дорозі. Щоразу, коли ви сумніваєтесь, використовуйте --dry-runопцію на rsync. Він надрукує те, що зробив би , фактично нічого не роблячи.


2

Замість запуску rsyncкожні 5 секунд ви можете використовувати демон lsyncd для перегляду дерева каталогів.

Він працює в OS X через /dev/fsevents, але у мене немає .debфайлу, готового до плагіна . Трохи примхливим є його складання та встановлення. Поки я не випущу версію 2.0.6 (незабаром), я б радив використовувати голову GIT, оскільки lsyncd 2.0.5 отримав деякі відомі помилки OS X.


Я щойно випустив фіксовану версію OSX. На відміну від необхідності витрачати ресурси, виконуючи щось кожні 5 секунд, хоча, ймовірно, нічого не сталося, Lsyncd зателефонує rsync лише тоді, коли щось сталося.
axkibe

1

rsync був би чудовим інструментом для цього, і він вбудований в Mac OS. Він перевірить відмінності між двома місцями, а потім лише скопіює зміни дельти в мережі. rsync без зайвих прапорів робить майже саме те, що ви шукаєте.

Єдине доповнення - вам потрібно запускати кожні 5 секунд, щоб перевірити на наявність змін. Це можна зробити, скориставшись запуском, на цьому сайті є чудовий приклад . У цьому прикладі виглядає так, що сценарій працює, а потім спить 5 секунд, а потім запускається знову.

Проблема із запуском цього так часто полягає в тому, що інструмент також повинен буде перевірити відмінності, і якщо буде так багато змін за 5 секунд, накладні витрати на запис цих змін та їх передачу можуть зайняти більше 5 секунд.



0

Я використовував FolderSync (8,99 App Store) і мені дуже подобається. Хороший інтерфейс користувача із синхронізованим переглядом на двох панелях. Дозволяє зберегти завдання синхронізації для подальшого повторного використання.

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