rsync opção para excluir arquivos parciais

3

Estamos usando rsync para sincronizar duas pastas na mesma máquina.

Os arquivos serão gravados em uma pasta de origem de outro aplicativo. Temos o problema de que, mesmo que um arquivo não seja completamente escrito / copiado para a pasta de origem, o rsync copia esse arquivo para o destino.

Existe alguma maneira / opção de verificar / transferir somente arquivos completos da pasta de origem

    
por SpringUser 06.08.2015 / 14:37

2 respostas

0

Se os tamanhos dos arquivos forem corrigidos (após a operação de gravação do aplicativo), você poderá transferir apenas os arquivos com base no tamanho para que os arquivos que ainda não foram gravados não sejam copiados:

--max-size=SIZE         don't transfer any file larger than SIZE
--min-size=SIZE         don't transfer any file smaller than SIZE

opções de rsync fornecem isso.

Como alternativa, você pode usar fuser ou lsof para verificar se o aplicativo está gravando no arquivo no momento da transferência inicial:

if fuser /path/to/file.txt >/dev/null 2>&1; do
    rsync ....
else
    sleep 10
fi
    
por 06.08.2015 / 15:15
1

É impossível excluir arquivos parciais porque não existe esse conceito. Assim que o produtor criou o arquivo, o arquivo existe, mas ele começa vazio e é preenchido gradualmente.

Você pode testar se o arquivo está aberto para gravação; isso diria que está incompleto. No entanto, isso não é confiável: se o produtor falha (o processo falha ou o sistema falha), você fica com um arquivo incompleto que parece completo.

O que você deve fazer é definir um protocolo para o produtor marcar o arquivo como completo. A maneira normal de fazer isso (e praticamente da única maneira sensata) é o produtor criar o arquivo em um local temporário e, em seguida, movê-lo (com uma chamada de sistema rename ou o comando mv shell) quando está terminado.

Você pode usar uma convenção de nomenclatura:

  • Produtor: escreva para $FILENAME.tmp e passe para o arquivo final.

    generate_data >"dir/$FILENAME.tmp"
    mv "dir/$FILENAME.tmp" "dir/$FILENAME"
    
  • Consumidor: exclua .tmp arquivos.

    rsync -a --exclude='*.tmp' dir remote:
    

Ou você pode usar um diretório temporário.

  • Produtor: escreva no diretório de teste e vá para o local final.

    generate_data >"dir/staging/$FILENAME"
    mv "dir/staging/$FILENAME" "dir/"
    
  • Consumidor: exclua o diretório temporário.

    rsync -a --exclude='/staging' dir remote:
    
por 07.08.2015 / 10:34