
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 inotifywait
o 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 -l
em 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.)