Linux: sincronizar arquivos continuamente, unidirecionalmente

Linux: sincronizar arquivos continuamente, unidirecionalmente

Cenário: Um IDE é configurado em um desktop Linux, editando arquivos PHP localmente. Cada vez que salvo um arquivo, quero que essa alteração apareça no servidor Linux onde o Apache está sendo executado. O servidor tem ssh (e samba e nfs).

Como referência, quando editei arquivos no Windows, finalmente descobri o WinSCP como a ferramenta exata que precisava - o WinSCP tem apenas este recurso presente, com sincronização inicial e depois atualização contínua, usando o serviço de observação do sistema de arquivos: "Keep Remote Directory up to Data".

No Linux, pode-se argumentar que o sshfs poderia ser empregado para evitar totalmente a necessidade de sincronização. No Windows, um compartilhamento de samba faria o mesmo. No entanto, quero que o IDE funcione com arquivos locais (em um disco SSD!), sem precisar passar pela rede para fazer indexação de PHP e outras coisas, o que leva muito tempo.

Mesmo assim, o sshfs pode fazer parte da solução - de modo que a sincronização contínua só precisava ser feita entre dois diretórios locais.

Alguma idéia ou sugestão?

Responder1

Você também pode usar inotifywaito pacote inotify-tools.

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

Responder2

Lsyncdseria uma boa solução para isso.

Lsyncd monitora uma interface de monitor de eventos de árvores de diretório local (inotify ou fsevents). Ele agrega e combina eventos por alguns segundos e então gera um (ou mais) processo(s) para sincronizar as alterações. Por padrão, é rsync. Lsyncd é, portanto, uma solução leve de espelho ao vivo que é comparativamente fácil de instalar, não requer novos sistemas de arquivos ou dispositivos de bloco e não prejudica o desempenho do sistema de arquivos local.

Resumindo, ele usa o mesmo tipo de ferramentas para fazer o trabalho (inotify e rsync) sugerido por outras respostas, mas é mais fácil de configurar para alguém não familiarizado com scripts de shell.

Responder3

Preciso muito disso, pois meu código precisa ser executado em caixas remotas e escrevo código na máquina local. Encontrei uma boa ferramenta que você pode usar para monitorar continuamente suas pastas locais e sincronizá-las com uma pasta remota ou local:https://github.com/axkibe/lsyncd

Um comando simples para sincronizar continuamente um diretório local com uma máquina remota por ssh será:

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

Assim como com qualquer outro comando rsync, certifique-se de fornecer o caminho da pasta correto e verifique antes de executar o comando. Quase matei uma de minhas máquinas remotas porque perdi o diretório de destino correto. Certifique-se de não perder o caminho remoto e não use '/' a menos que saiba o que está fazendo.

Responder4

O que fiz uma vez foi ter um script bash rodando ls -lem loop (com algum sono) e comparando com a saída anterior. Se mudou, faça sua sincronização.

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

Inicie este script em um novo terminal com os nomes dos arquivos como argumentos (após instalar sua ferramenta de sincronização).

(Usei isso para iniciar uma compilação, não para sincronizar, mas funcionaria de maneira semelhante.)

informação relacionada