Linux: sincronize arquivos continuamente, de uma maneira

61

Cenário: Um IDE é configurado em uma caixa de desktop Linux, editando arquivos PHP localmente. Sempre que eu salvar um arquivo, quero que essa alteração apareça no servidor linux em que o Apache está sendo executado. O servidor possui ssh (e samba e nfs).

Como referência, quando editei arquivos no Windows, finalmente encontrei o WinSCP como a ferramenta exata de que precisava - o WinSCP possui apenas esse recurso presente, com sincronização inicial e atualização contínua, usando o serviço de monitoramento de sistema de arquivos: "Mantenha o Diretório Remoto atualizado Encontro".

No Linux, alguém poderia argumentar que os sshfs poderiam ser empregados para contornar completamente 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 PHP e outras coisas, o que leva anos.

Porém, o sshfs pode fazer parte da solução - portanto, a sincronização contínua só precisa ser feita entre dois diretórios locais.

Alguma idéia ou sugestões?

Stolsvik
fonte
considere usar a ferramenta rsync, ou compartilhar uma pasta na raiz de documentos do servidor web para que você possa operar nos arquivos diretamente sob as janelas
Vinicius Kamakura
2
rsync é "uma jogada". Preciso de atualizações contínuas, esse é o ponto inteiro aqui - edito um arquivo, salve-o e o produto / sistema / idéia que solicito selecionaria essa ação de salvamento e carregaria a nova versão imediatamente. NB: Ambos os lados são Linux. NB2: Eu quero editar em arquivos locais, senão o próprio sshfs o cortaria.
Stolsvik
6
Eleitores fora do tópico, esse é um caso de fronteira, mas acho que se enquadra claramente nas "ferramentas comumente usadas pelos programadores" no FAQ.
Karl Bielefeldt
Embora não seja uma combinação perfeita, você pode olhar para overlayfs
PHS

Respostas:

57

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
Michał Šrajer
fonte
13
No site inotify-tools , há um bom exemplo de como usar inotify-wait para acionar um rsync.
Karl Bielefeldt
Eu estava procurando exatamente por isso ontem à noite! ahhh eu amo superusuário
CenterOrbit
Existe uma maneira de fazer isso, mas mantenha o soquete aberto? rsync/ scptem um atraso irritante ao estabelecer a conexão ssh.
Flash
11
@ Flash sim, você pode usar a multiplexação SSH para manter o soquete aberto.
que você precisa saber é o seguinte
31

Lsyncd seria uma boa solução para isso.

O Lsyncd observa uma interface do monitor de eventos das árvores de diretórios locais (inotify ou fsevents). Ele agrega e combina eventos por alguns segundos e gera um (ou mais) processo (s) para sincronizar as alterações. Por padrão, isso é rsync. O Lsyncd é, portanto, uma solução leve de espelho ao vivo que é comparativamente fácil de instalar, sem exigir 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 realizar o trabalho (inotify e rsync), conforme sugerido por outras respostas, mas é mais fácil de configurar para alguém que não esteja familiarizado com scripts de shell.

jcharaoui
fonte
além de mais fácil, ele também tenta lidar com situações como mover o diretório corretamente, sem precisar sincronizar novamente.
Ciantic
5
Cuidado: Este programa possui alguns recursos problemáticos. No momento em que escrevemos isso: 1. Exclui arquivos remotos que não estão presentes na fonte por padrão. 2. "remote:" refere-se a "remote: /" em vez da pasta inicial. 3. Daemonizes, para que você não saiba o que está acontecendo. 4. Não respeita imediatamente o sinal TERM.
Friedrich
27

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 a pasta remota ou local: https://github.com/axkibe/lsyncd

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

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

Assim como com qualquer outro comando rsync, verifique o caminho da pasta corretamente e verifique antes de executar o comando. Quase matei uma máquina remota porque perdi para fornecer um 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.

atormentar
fonte
Este merece muito mais upvotes, mesmo três anos após ter sido postada
FliiFe
Funciona muito bem, finalmente funcionou no meu Mac OS Sierra, funciona demais.
Erik van de Ven
2

Se você precisar observar o sistema de arquivos, inotify é a maneira de fazê-lo. Eu escreveria um script python simples usando o pyinotify para executar a sincronização quando o sistema de arquivos for alterado. Veja a documentação . Você também pode verificar o autosync.py para obter alguma inspiração. Diverta-se.

Michał Šrajer
fonte
1

O que eu fiz uma vez é ter um script bash rodando ls -lem loop (com um pouco de sono) e comparando com a saída anterior. Se ele 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 esse script em um novo terminal com os nomes de arquivo como argumentos (depois de colocar sua ferramenta de sincronização).

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

Paŭlo Ebermann
fonte
-1

Abordagem muito mais simples:

Exporte seu / var / www com samba (ou nfs) e trabalhe nos arquivos diretamente no servidor.

Outra solução: a maioria dos IDEs permite várias configurações de implantação - verifique se há alguma que seja adequada a você.

Ou defina um sistema de gerenciamento de código-fonte como Git, Bazaar etc.

Boa sorte !!

Dragos
fonte
3
Obrigado por responder. No entanto, excluí especificamente essa mesma abordagem na questão.
Stolsvik