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.