Software per sincronizzare due directory (locale / remoto)

8

Ho bisogno di un software in grado di rilevare i cambiamenti nella directory (A) ogni 5 secondi circa e di caricare / eliminare i file modificati da / in una directory remota (B).

Ho trovato software non commerciale, link . Mi chiedo se ci sono alternative commerciali?

    
posta Gajus 13.02.2012 - 13:01
fonte

5 risposte

12

rsync è sicuramente lo strumento giusto per questo lavoro. Esiste per mantenere sincronizzate le directory e può farlo con un bel po 'di intelligenza. Ad esempio: trasferirà solo delta ogni volta che può e può funzionare su tunnel ssh.

Supponiamo che tu abbia la sorgente della macchina che ospita la tua versione live dell'albero della directory /my/tree e della macchina sink che vuoi mantenere in stretta sincronizzazione con essa. Se avevi un account ssh su sink , puoi utilizzare source rsync come segue:

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

Questo presuppone che tu voglia /my/tree nello stesso identico posto su sink così come lo hai su source . Ovviamente, non è necessario tenerlo nello stesso identico punto.

Interruzione della riga di comando:

  • -avz : modalità archivio, uscita dettagliata, utilizza la compressione durante il trasferimento
  • --delete : cancella i file su sync che non sono presenti su source
  • -e ssh : usa ssh come metodo di connessione

Questa chiamata, naturalmente, ti chiederà la tua password quando la fai. Se si desidera eseguire questa operazione in modo automatico, sarà necessario condividere alcune chiavi tra gli account sulle macchine e utilizzare la crittografia a chiave pubblica-privata per effettuare la connessione ssh.

Per impostare la tua coppia di chiavi per questo rysnc, esegui il seguente comando sulla tua macchina sorgente :

> 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

Per far funzionare questa coppia di chiavi, dobbiamo aggiungere il contenuto di ~/.ssh/my-rsync-key.pub al file ~<remoteuser>/.ssh/authorized_keys sulla macchina sink .

Prima copia il file sulla macchina sink :

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

Quindi ssh alla macchina sink e importa la chiave eseguendo quanto segue come remoteuser sulla macchina:

> 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

Per ulteriori suggerimenti su come bloccare la connessione ssh tra le tue macchine sorgente e sink ti consiglio di dare un'occhiata a questa pagina .

Dalla tua macchina sorgente puoi verificare che questa configurazione funzioni eseguendo:

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

Questo eseguirà un ciclo di esecuzione di un rsync. Se vedi il comando rsync che collega e confronta i file sai che le cose sono configurate correttamente.

Ora abbiamo bisogno di un modo semplice per chiamare questo comando rsync da un file di configurazione LaunchD come mostrato in questa utile risposta su questo sito . Dal momento che vuoi che questa chiamata avvenga in un ciclo stretto, devi assicurarti di non avere più copie di rsync in esecuzione contemporaneamente. Puoi utilizzare il gruppo per creare un mutex che garantisce che uno script di bash sia singleton: solo una sua istanza viene eseguita a una volta su una macchina. Quindi creeremo il seguente script sul 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}

Salva come ~/my_rsync.sh .

Quello script si prenderà cura di fare il rsync per te. Tutto ciò che devi fare ora è configurarlo tramite LaunchD e farlo funzionare in un ciclo stretto. Seguendo le indicazioni da qui e modificandolo per soddisfare le nostre esigenze, creeremo ~/Library/LaunchAgents/my-rsync.plist in un editor di testo e crea il contenuto:

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

Questo dovrebbe occuparsi di cose.

Si applicano i normali avvertimenti: l'ho scritto a memoria e non l'ho testato. Quindi non seguire ciecamente. Testare attentamente lungo la strada. Ogni volta che sei in dubbio, usa l'opzione --dry-run su rsync. Stamperà ciò che avrebbe fatto senza effettivamente fare nulla.

    
risposta data 13.02.2012 - 15:53
fonte
2

Invece di eseguire rsync ogni 5 secondi, puoi usare il demone lsyncd per guardare l'albero delle directory.

Funziona in OS X fino a /dev/fsevents , ma non ho un file pronto per il plugin .deb . È un po 'geek per farlo compilare e installare. Fino a quando non rilasciare la versione 2.0.6 (presto) consiglierei di usare GIT head, dato che lsyncd 2.0.5 ha alcuni bug OS X noti.

    
risposta data 16.02.2012 - 07:41
fonte
1

rsync sarebbe un ottimo strumento per questo ed è integrato nel Mac OS. Verificherà le differenze tra due posizioni e quindi copierà solo le modifiche delta sulla rete. rsync senza bandiere aggiuntive fa esattamente quello che stai cercando.

L'unica aggiunta è che è necessario eseguirlo ogni 5 secondi per verificare le modifiche. Puoi farlo usando launchd, con un ottimo esempio già su questo sito . In questo esempio sembra che lo script sia mantenuto in esecuzione, quindi dorme 5 secondi, quindi esegue nuovamente.

Il problema con l'esecuzione così frequente è che lo strumento dovrà anche controllare le differenze, e se ci sono così tante modifiche in 5 secondi, il sovraccarico per registrare quelle modifiche e trasferirle potrebbe richiedere più di 5 secondi.

    
risposta data 13.02.2012 - 14:57
fonte
0

Folderwatch è un'alternativa commerciale solo $ 11,99 di AppStore. Folderwatch sincronizza (specchi) le cartelle su volumi formattati HFS-Plus in tempo reale su unità esterne e file server AFP. link

    
risposta data 23.06.2012 - 20:33
fonte
0

Utilizzo FolderSync (8.99 App Store) e mi piace molto. Bella interfaccia utente con la navigazione sincronizzata in due riquadri. Ti consente di salvare un processo di sincronizzazione per riutilizzarlo in seguito.

    
risposta data 24.06.2012 - 06:17
fonte

Leggi altre domande sui tag