Você também pode usar inotifywait
do pacote inotify-tools.
inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
echo need to rsync $MODFILE ...
done
Cenário: Um IDE é configurado em uma caixa da área de trabalho do Linux, editando arquivos PHP localmente. Toda vez que eu salvar um arquivo, eu quero que esta mudança apareça no servidor linux onde o Apache está rodando. O servidor tem ssh (e samba e nfs).
Como referência, quando editei arquivos no Windows, finalmente cheguei ao WinSCP como a ferramenta exata que eu precisava - o WinSCP tem apenas esse recurso presente, com sincronização inicial e atualização contínua, usando o serviço watch do sistema de arquivos: Diretório até a data ".
No Linux, pode-se argumentar que o sshfs poderia ser empregado para contornar a necessidade de sincronização inteiramente. No Windows, um compartilhamento de samba faria o mesmo. No entanto, eu quero que o IDE trabalhe com arquivos locais (em um disco SSD!), Sem ter que passar pela rede para indexar o PHP e whatnots, o que leva muito tempo.
Mas o sshfs pode ser uma parte da solução, no entanto - de modo que a sincronização contínua só precisa ser feita entre dois diretórios locais.
Alguma ideia ou ponteiros?
O Lsyncd seria uma boa solução para isso.
Lsyncd watches a local directory trees event monitor interface (inotify or fsevents). It aggregates and combines events for a few seconds and then spawns one (or more) process(es) to synchronize the changes. By default this is rsync. Lsyncd is thus a light-weight live mirror solution that is comparatively easy to install not requiring new filesystems or blockdevices and does not hamper local filesystem performance.
Bottom-line, ele usa o mesmo tipo de ferramentas para fazer o trabalho (inotify e rsync), como sugerido por outras respostas, mas é mais fácil de configurar para alguém que não esteja familiarizado com scripts de shell.
Eu preciso muito disso já que meu código precisa ser executado em caixas remotas e eu escrevo código na máquina local. Eu encontrei uma boa ferramenta que você pode usar para monitorar continuamente suas pastas locais e sincronizá-las para a pasta remota ou local: link
Um comando simples para sincronizar continuamente um diretório local com a máquina remota sobre o ssh será:
lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>
Assim como com qualquer outro comando rsync, certifique-se de dar o caminho da pasta para a direita e verifique antes de executar o comando. Eu quase matei uma das minhas máquinas remotas porque perdi 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.
Se você precisa observar o sistema de arquivos, então inotify é a maneira de fazê-lo. Gostaria de escrever um script python simples usando pyinotify para realizar a sincronização quando o sistema de arquivos for alterado. Veja a documentação . Você também pode verificar o autosync.py para alguma inspiração. Divirta-se.
O que eu fiz uma vez é ter um script bash executando ls -l
em um loop (com algum tempo de espera) 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 (depois de colocar sua ferramenta de sincronização).
(usei isso para iniciar uma compilação, não para sincronizar, mas isso funcionaria de maneira semelhante).
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 IDE permite várias configurações de implantação - verifique se há uma que combina com você.
Ou defina um sistema de gerenciamento de código-fonte como Git, Bazaar, etc.
Boa sorte !!