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

9

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

Я нашел некоммерческое программное обеспечение, https://github.com/devstructure/doubledown . Мне интересно, есть ли коммерческие альтернативы?

Gajus
источник

Ответы:

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 к стоковой машине и импортировать ключ, выполнив следующие действия, как RemoteUSER на машине:

> 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 для создания мьютекса, который гарантирует, что 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 head, так как lsyncd 2.0.5 получил некоторые известные ошибки OS X.

axkibe
источник
Я только что выпустил исправленную версию OSX. В отличие от необходимости тратить ресурсы, выполняя что-то каждые 5 секунд, хотя, вероятно, ничего не произошло, Lsyncd будет вызывать rsync только тогда, когда что-то произошло.
Axkibe
1

rsync будет отличным инструментом для этого, и он встроен в Mac OS. Он проверит различия между двумя местоположениями, а затем скопирует только дельта-изменения по сети. rsync без каких-либо дополнительных флагов делает почти то, что вы ищете.

Единственным дополнением является то, что вам нужно будет запускать его каждые 5 секунд для проверки изменений. Вы можете сделать это с помощью launchd, с отличным примером уже на этом сайте . В этом примере это выглядит так, как будто скрипт продолжает работать, затем спит 5 секунд, а затем снова запускается.

Проблема с запуском этого часто заключается в том, что инструмент также должен будет проверить различия, и если в течение 5 секунд будет так много изменений, накладные расходы на запись этих изменений и их передачу могут занять более 5 секунд.

jmlumpkin
источник
0

Folderwatch - это коммерческая альтернатива всего за $ 11,99. Folderwatch синхронизирует (зеркалирует) папки на отформатированных томах HFS-Plus в режиме реального времени с внешними дисками и файловыми серверами AFP. http://itunes.apple.com/us/app/folderwatch/id408224368?mt=12

Pro Backup
источник
0

Я использую FolderSync (магазин приложений 8.99) и мне очень нравится. Хороший интерфейс с синхронизированным просмотром в двух панелях. Позволяет сохранить задание синхронизации для последующего повторного использования.

jtreser
источник