Для решения задачи по синхронизации данных между двумя машинами, в ситуации когда изменения могут появиться на каждом из компьютеров, прекрасно подходит утилита unison (http://www.cis.upenn.edu/~bcpierce/unison/). При синхронизации между удаленными машинами в качестве транспорта может использоваться ssh. При обнаружении конфликтов, например, когда на обоих машинах отредактирован один и тот же файл, unison пытается разрешить конфликт автоматически, а если это не удается предоставляет пользователю интерфейс для принятия решения.Устанавливаем unison.
Fedora/RHEL/CentOS:
sudo yum install unison
Debian/Ubuntu:
sudo apt-get install unison
FreeBSD:
# cd /usr/ports/net/unison/ && make install
Синхронизируем две локальные директории:
unison /test1 /test2
В процессе будет выводиться статистика и задаваться вопросы, касающаяся синхронизации и разрешения конфликтов, направление копирования будет указано стрелкой.
Для синхронизации с удаленной директорией необходимо указать:
unison /test1 ssh://testserver.test.ru//test1
Чтобы выполнить синхронизацию автоматически, без интерактивного взаимодействия с пользователем необходимо использовать опцию "-batch". В случае конфликта, выполнение будет прервано с выводом соответствующего уведомления.
Для определения сложной политики синхронизации можно создать файл конфигурации с определением параметров.
Например, создаем файл ~/.unison/test.prf:
# Определяем список директорий, которые будут синхронизированы
root = /home/project
root = /mnt/NFS/home/project
# Указываем сохранять права доступа и владельца
owner = true
times = true
# Определяем список поддиректорий, которые нужно синхронизировать, остальное игнорируем:
path = cgi-bin
path = htdocs
path = conf
# Определяем маски для файлов, которые не нужно синхронизировать
ignore = Name .htaccess
ignore = Name *~
ignore = Name .*~
ignore = Path conf/project.conf
ignore = Path htdocs/rrd
ignore = Path htdocs/mon
ignore = Name *.o
ignore = Name *.tmp
ignore = Name *.log
ignore = Name *.gz
ignore = Name *.iso
ignore = Name {,.}*{.old}
# Копируем в резервные копии изменяемых файлов в отдельную директорию
backup = Name *
backups = true
backupdir = /home/project/backup
# Определяем свою команду для отображения отличий между копиями файлов при конфликте
#diff = diff -y -W 79 --suppress-common-lines
# Сохраняем лог с результатами работы в отдельном файле
log = true
logfile = ./sync.log
При необходимости синхронизировать описанные в файле конфигурации директории, выполняем:
unison test
URL:
Обсуждается: http://www.opennet.me/tips/info/2422.shtml