Linux: sincronizza continuamente i file, in un modo


61

Scenario: un IDE è impostato su un desktop desktop Linux, modificando i file PHP localmente. Ogni volta che salvo un file, voglio che questa modifica appaia sul server Linux su cui è in esecuzione Apache. Il server ha ssh (e samba e nfs per quella materia).

Come riferimento, quando ho modificato i file su Windows, ho finalmente trovato WinSCP come lo strumento esatto di cui avevo bisogno - WinSCP ha proprio questa funzione presente, con sincronizzazione iniziale e quindi aggiornamento continuo, usando il servizio di controllo del filesystem: "Mantieni Directory remota fino a Data".

Su Linux, si potrebbe sostenere che sshfs potrebbe essere impiegato per eludere completamente la necessità della sincronizzazione. Su Windows, una condivisione di samba farebbe lo stesso. Tuttavia, voglio che l'IDE funzioni con i file locali (su un disco SSD!), Senza dover andare in rete per eseguire l'indicizzazione PHP e quant'altro, il che richiede anni.

Tuttavia, sshfs potrebbe essere una parte della soluzione, quindi la sincronizzazione continua doveva essere fatta tra due directory locali.

Qualche idea o suggerimento?


considera l'utilizzo dello strumento rsync o la condivisione di una cartella nella radice del documento del server web in modo da poter operare sui file direttamente sotto le finestre
Vinicius Kamakura,

2
rsync è "one go go". Ho bisogno di aggiornamenti continui, questo è l'intero punto qui: modifico un file, lo salvo e il prodotto / sistema / idea che richiedo prenderebbe questa azione di salvataggio e caricherà immediatamente la nuova versione. NB: Entrambe le parti sono Linux. NB2: Voglio modificare i file locali, altrimenti sshfs stesso lo taglierebbe.
stolsvik,

6
Elettori fuori tema, questo è un caso limite, ma penso che rientri abbastanza chiaramente negli "strumenti comunemente usati dai programmatori" nelle FAQ.
Karl Bielefeldt,

Anche se non è una corrispondenza perfetta, potresti guardare overlayfs
phs del

Risposte:


57

Puoi anche usare inotifywaitdal pacchetto inotify-tools.

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done

13
Sul sito Web di inotify-tools , c'è un buon esempio di come usare inotify-wait per attivare un rsync.
Karl Bielefeldt,

Stavo cercando questa cosa esatta ieri sera! ahhh I love superuser
CenterOrbit

C'è un modo per farlo ma mantenere aperto il socket? rsync/ scpha un fastidioso ritardo nello stabilire la connessione ssh.
Flash

1
@ Flash Sì, è possibile utilizzare il multiplexing SSH per mantenere aperto il socket.
Will Angley,

31

Lsyncd sarebbe una buona soluzione per questo.

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 blockdevices e non ostacola le prestazioni del filesystem locale.

In conclusione, utilizza lo stesso tipo di strumenti per eseguire il lavoro (inotify e rsync) come suggerito da altre risposte, ma è più facile da configurare per chi non ha familiarità con gli script di shell.


non solo più semplice, cerca anche di gestire situazioni come spostare correttamente la directory, senza rsyncing.
Ciantic,

5
Attenzione: questo programma ha alcune funzionalità problematiche. Al momento della scrittura di questo: 1. Elimina i file remoti non presenti nell'origine per impostazione predefinita. 2. "remote:" si riferisce a "remote: /" invece della cartella home. 3. Demonizza, quindi non sai cosa sta succedendo. 4. Non rispetta immediatamente il segnale TERM.
Friedrich,

27

Ne ho molto bisogno dal momento che il mio codice deve essere eseguito su box remoti e scrivo il codice sul computer locale. Ho trovato uno strumento utile che puoi utilizzare per monitorare continuamente le tue cartelle locali e sincronizzarle con le cartelle remote o locali: https://github.com/axkibe/lsyncd

Un semplice comando per sincronizzare continuamente una directory locale con la macchina remota su ssh sarà:

lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>

Proprio come con qualsiasi altro comando rsync, assicurati di dare il percorso della cartella giusto e controlla prima di eseguire il comando. Avevo quasi ucciso un mio computer remoto perché mi mancava di fornire una directory di destinazione corretta. Assicurati di non perdere il percorso remoto e non usare '/' a meno che tu non sappia cosa stai facendo.


Questo merita molti più voti, anche tre anni dopo che è stato pubblicato
FliiFe

Funziona alla grande, finalmente funziona sul mio Mac OS Sierra, funziona alla grande.
Erik van de Ven,


1

Quello che ho fatto una volta è avere uno script bash in esecuzione ls -lin un ciclo (con un po 'di sospensione) e confrontato con l'output precedente. Se è cambiato, esegui la sincronizzazione.

#!/bin/bash

listcommand="ls -l $*"

newfilelist=$( $listcommand )
while true
do
   if [[ $oldfilelist != $newfilelist ]]
   then
      oldfilelist=$newfilelist
      # run your synchronization tool
   fi
   sleep 10 || exit 2 
   newfilelist=$( $listcommand )
done

Avviare questo script in un nuovo terminale con i nomi dei file come argomenti (dopo aver inserito lo strumento di sincronizzazione).

(L'ho usato per avviare una compilation, non per sincronizzare, ma avrebbe funzionato in modo simile.)


-1

Approccio molto più semplice:

Esporta il tuo / var / www con samba (o nfs) e lavora sui file direttamente sul server.

Un'altra soluzione: la maggior parte degli IDE consente varie configurazioni di distribuzione - controlla se ce n'è uno adatto a te.

Oppure imposta un sistema di gestione del codice sorgente come Git, Bazaar, ecc.

In bocca al lupo !!


3
Grazie per aver risposto. Tuttavia, ho espressamente escluso questo stesso approccio nella domanda.
stolsvik,
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.