Come posso attivare rsync in caso di modifica del file?


18

Posso sincronizzare le cartelle con rsync -avz /directory /target, ora vorrei farlo se ho cambiato un file, /directoryquindi rsyncdovrebbe essere chiamato automaticamente.

Sto usando Virtual Box e la cartella condivisa di Virtual Box è molto lenta, specialmente se hai una pagina web che utilizza la cartella condivisa come root del documento. Conrsync sarei in grado di lavorare con i miei file locali sulla cartella condivisa e sincronizzarlo automaticamente con la radice del documento.

Spero che qualcuno abbia un'idea di come farlo, crontabnon andrebbe bene, perché viene eseguito ogni x minuti, quindi se non faccio nulla, chiamerà comunque rsyncma non se avessi modificato il mio file.

I migliori saluti

Risposte:


18

crontab non sarebbe buono, perché viene eseguito ogni x secondi / minuti, quindi se non faccio nulla, chiamerà comunque rsync ma non se avessi modificato il mio file

rsyncsincronizzerà solo i file che sono stati modificati. Se nulla è cambiato, uscirà. Questo è davvero un sovraccarico minimo.

Se non sei soddisfatto di ciò puoi usare inotifywait:

while inotifywait -r /directory/*; do
    rsync -avz /directory /target
done

Sarà più istantaneo ma farà le cose ogni volta che salvi.


1
bene il problema sembra che inotify non sia in grado di controllare le cartelle nfs condivise. per essere sicuro, quello che voglio, cercando di descrivere ho installato la scatola virtuale con Vagrant, lì ho una cartella condivisa "progetti" che è montata all'avvio, tutti i file del mio server web si trovano lì in modo da poterli modificare sul mio host sistema (win7) come ho detto che le cartelle condivise della scatola virtuale sono molto lente, quindi la soluzione potrebbe essere quella di sincronizzare la cartella nfs montata in un altro posto, ad esempio / var / www, ma i modi comuni non funzionano, ho provato a filtrare, icrontab, gues gamin o fam aiuterebbe, ma non so come avviarli o usarli
BlackScorp

@BlackScorp realisticamente sei bloccato con solo cronning rsync e lasciandolo decidere cosa deve essere sincronizzato. Come ho guidato nella risposta, questa non è una pessima opzione.
Oli

1
L'altra opzione è di inviare i file dall'host anziché cercare di rilevare le modifiche in remoto.
Oli

bene questa soluzione che ho usato prima, ha 2 problemi: 1) ho dovuto riconnettermi ogni volta nella mia scatola virtuale per modificare i file, il che significa che il mio virtuale deve essere in esecuzione, la modifica rapida non funziona più 2) non so perché, ma perché del processo di scansione del progetto della mia samba IDE (Netbeans) mostra un utilizzo della CPU del 99% e tutto all'interno della scatola virtuale è solo lento durante lo sviluppo proverò la soluzione rsyn + cronjob o il php build nel webserver
BlackScorp

La inotifywaitsoluzione presenta un piccolo ma importante inconveniente: non rileva i cambiamenti avvenuti durante l' rsyncesecuzione. Si consideri la seguente situazione: il file A è cambiato; rsync è attivato; quando rsync ha quasi finito la sincronizzazione del file A, il file B viene modificato. Ora, rsyncfinito ed inotifywaitè in esecuzione, ma il file B non è sincronizzato e non sarà sincronizzato fino alla prossima modifica. Prendi in considerazione l'utilizzolsyncd come suggerito da @Arigion.
MarSoft,

6

Puoi usare Lsyncd (Live Syncing Daemon) :

Lsyncd guarda un'interfaccia di monitoraggio eventi di alberi di directory locali (inotify o fsevents). Aggrega e combina gli eventi per alcuni secondi, quindi genera uno (o più) processi per sincronizzare le modifiche. Per impostazione predefinita, questo è rsync. Lsyncd è quindi una soluzione live mirror leggera, relativamente semplice da installare che non richiede nuovi filesystem o blocchi di dispositivi e non ostacola le prestazioni del filesystem locale.

Ecco ad esempio un tutorial per Ubuntu 16.04 .


2

Puoi usare inotifywaite rsync. inotifywaitcon l'evento modify,create,deleteabilitato. In questo modo ti sincronizzerai con il tuo server solo quando il file cambia, altrimenti si sincronizzerà ogni volta che un file viene letto (gli editor leggono più volte il tuo file per verificare se ci sono cambiamenti). Così ha detto:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done

Questo non rileverà i cambiamenti avvenuti mentre rsync è in esecuzione. Prendi in considerazione l'utilizzo lsyncdcome suggerito da @Arigion.
MarSoft,

questo applicherà nuovamente tutti gli eventi su tutti i file dopo ogni modifica ... e quando si applica non vedrà alcun cambiamento in quel periodo ...
Qualcuno il

0

Espandendo leggermente un commento alla risposta accettata, ho avuto successo utilizzando fswatch per innescare un scpfile modificato nel guest. Su Linux questo è un wrapper inotifyma è anche multipiattaforma (sono su un Mac con un guest QEMU basato su Arm). Ho anche puntato su una sshbuild remota. L'approccio push funziona bene con le condivisioni che si comportano in modo tutt'altro che ideale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.