Для решения задачи по синхронизации данных между двумя машинами, в ситуации
когда изменения могут появиться на каждом из компьютеров, прекрасно подходит
утилита 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