9 votos

Software para sincronizar dos directorios (local/remoto)

Necesito un software que detecte los cambios en el directorio (A) cada 5 segundos más o menos y suba/borre los archivos modificados desde/en el directorio remoto (B).

He encontrado un software no comercial, https://github.com/devstructure/doubledown . Me pregunto si hay alguna alternativa comercial.

12voto

shsteimer Puntos 8749

rsync es definitivamente la herramienta adecuada para este trabajo. Existe para mantener los directorios sincronizados y puede hacerlo con un poco de inteligencia. Por ejemplo: transferirá sólo deltas siempre que pueda y puede trabajar sobre túneles ssh.

Digamos que tienes una máquina fuente que aloja su versión en vivo del árbol de directorios /my/tree y la máquina fregadero que quieres mantener en estrecha sincronización con él. Si tuvieras una cuenta ssh en fregadero podrías, desde fuente utilice rsync de la siguiente manera:

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

Esto supone que usted quiere /my/tree en el mismo punto exacto de fregadero como lo tienes en fuente . Por supuesto, no es necesario que lo mantengas exactamente en el mismo lugar.

Desglosando la línea de comandos:

  • -avz : modo de archivo, salida verbosa, uso de la compresión durante la transferencia
  • --delete : borrar archivos en Sincronización que no están presentes en fuente
  • -e ssh : Utilice ssh como método de conexión

Esta llamada, por supuesto, te pedirá tu contraseña cuando la hagas. Si quieres hacer esto de alguna manera automatizada vas a necesitar compartir algunas claves entre las cuentas de las máquinas y usar encriptación de clave pública-privada para hacer la conexión ssh.

Para configurar su par de claves para este rysnc, ejecute el siguiente comando en su fuente máquina:

> 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

Para que este par de claves funcione tenemos que añadir el contenido de ~/.ssh/my-rsync-key.pub a la ~<remoteuser>/.ssh/authorized_keys archivo en el fregadero máquina.

En primer lugar, copie el archivo en el fregadero máquina:

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

A continuación, haga clic en el botón fregadero e importar la clave ejecutando lo siguiente como usuario remoto en la máquina:

> 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

Para obtener consejos adicionales sobre el bloqueo de la conexión ssh entre su fuente y fregadero máquinas recomiendo echar un vistazo a esta página .

De su fuente puede probar que esta configuración funciona ejecutando:

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

Eso hará un simulacro de un rsync. Si ves que el comando rsync se conecta y compara los archivos, sabrás que las cosas están bien configuradas.

Ahora necesitamos una forma fácil de llamar a este comando rsync desde un archivo de configuración de LaunchD como se muestra en esta útil respuesta en este sitio . Como quieres que esta llamada se produzca en un bucle cerrado, tendrás que asegurarte de que no tienes varias copias del rsync ejecutándose al mismo tiempo. Puedes usar flock para crear un mutex que asegura que un script bash es singleton: sólo una instancia de él se ejecuta a la vez en una máquina. Así que vamos a crear el siguiente script en el disco:

#!/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}

Guárdalo como ~/my_rsync.sh .

Ese script se encargará de hacer el rsync por ti. Todo lo que necesitas hacer ahora es configurarlo a través de LaunchD y hacer que se ejecute en un bucle cerrado. Siguiendo las instrucciones de aquí y modificándolo para que se ajuste a nuestras necesidades, vamos a crear ~/Library/LaunchAgents/my-rsync.plist en un editor de texto y hacer el contenido:

<?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>

Eso debería solucionar las cosas.

Se aplican las advertencias habituales: He escrito esto de memoria y no lo he probado. Así que no lo sigas a ciegas. Pruebe cuidadosamente a lo largo del camino. Siempre que tengas dudas, utiliza la función --dry-run en rsync. Imprimirá lo que sería sin hacer nada en realidad.

2voto

ZoogieZork Puntos 366

En lugar de ejecutar el rsync cada 5 segundos, puede utilizar el demonio lsyncd para observar el árbol de directorios.

Funciona en OS X a través de /dev/fsevents , pero no tengo un plugin listo .deb archivo. Es un poco friki conseguir que se compile e instale. Hasta que publique la versión 2.0.6 (próximamente) aconsejo utilizar GIT head, ya que lsyncd 2.0.5 tiene algunos fallos conocidos en OS X.

1voto

Bill Puntos 1408

rsync sería una gran herramienta para esto, y está integrada en el Mac OS. Comprobará las diferencias entre dos ubicaciones, y entonces sólo copiará los cambios delta a través de la red. rsync sin ninguna bandera extra hace casi exactamente lo que estás buscando.

El único añadido es que tendrías que hacerlo funcionar cada 5 segundos para comprobar los cambios. Puedes hacer esto usando launchd, con un gran ejemplo ya en este sitio . En este ejemplo parece que el script se mantiene en ejecución, y luego duerme 5 segundos, para luego volver a ejecutarse.

El problema de ejecutar esto tan a menudo es que la herramienta también tendrá que comprobar las diferencias, y si hay tantos cambios en 5 segundos, la sobrecarga de registrar esos cambios y transferirlos puede llevar más de 5 segundos.

0voto

Pro Backup Puntos 2314

Folderwatch es una alternativa comercial de sólo 11,99 dólares de la Appstore. Folderwatch sincroniza (refleja) carpetas en volúmenes formateados HFS-Plus en tiempo real a unidades externas y servidores de archivos AFP. http://itunes.apple.com/us/app/folderwatch/id408224368?mt=12

0voto

Jeff Dallien Puntos 1171

He estado usando FolderSync (8.99 App store) y realmente me gusta. Una bonita interfaz de usuario con navegación sincronizada en dos paneles. Le permite guardar un trabajo de sincronización para su posterior reutilización.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X