O cp/rsync é assíncrono?

O cp/rsync é assíncrono?

Estamos executando um script de backup que primeiro copia um arquivo para um destino e depois taro executa.

DIR2BCK='/foo/bar'
TMPDIR=$(mktemp -d)
rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1
tar czf /tmp/foo.backup.tar ${TMPDIR}

Depois de executar este último comando, às vezes é mostrado o seguinte aviso:

/tmp/tmp.blqspkA136: arquivo alterado conforme o lemos

Copiamos o destino para um diretório temporário justamente para evitar alterações no arquivo no momento da compactação. Esse comportamento também é reproduzível ao usar o cpcomando em vez de rsync. Durante toda a minha vida pensei que esses comandos eram síncronos, mas esse aviso parece mostrar o contrário.

Se eu colocar um sleepcomando entre as linhas rsync/ cpe tar, o aviso não aparece, mas considero esta uma solução não muito limpa.

Alguns fatos:

  • Tentei adicionar um synccomando entre os comandos rsynce tarcom o mesmo resultado.
  • Conforme sugerido por @jcbermu, também tentei alterar o script para que as duas linhas fossem:

    rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 &
    wait
    

    Executei o script várias vezes e alguns deles mostraram o mesmo comportamento, alegando que o arquivo foi alterado durante a cópia.

  • O sistema de arquivos usado é EXT4 para ${TMPDIR}e ${DIR2BCK}.

  • ${DIR2BCK}está em um sistema de arquivos remoto, na verdade este é um ponto de montagem do samba de uma máquina remota. ${TMPDIR}está no sistema de arquivos local. No entanto, mudar ${DIR2BCK}para o sistema de arquivos local não faz diferença.
  • Todos os sistemas de arquivos são baseados em hardware RAID-5.

Esses comandos são realmente síncronos? Caso contrário, existe uma maneira de fazê-los assim ou um comando alternativo?

Responder1

Uma solução é reescrevê-lo como:

rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 ; tar czf foo.backup.tar ${TMPDIR}

Então, tarnão vou começar até rsyncterminar.


A outra solução é enviar o cp/ rsyncpara segundo plano e esperar até que termine com o comando wait.

Por exemplo:

rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 &
wait
tar czf foo.backup.tar ${TMPDIR}

O último &da rsynclinha envia a execução para segundo plano (torna-se umcriançada sessão atual) e então waitforça esta sessão shell a esperar até que todos os filhos tenham terminado para continuar.

Responder2

Coloquei um comando sleep entre as linhas rsync/cp e tar, o aviso não aparece, mas considero esta uma solução não muito limpa.

Bom para você ou para ter padrões. O que acontece se, em vez de dormir, você usar:

sincronização sudo; eco 3 | sudo tee /proc/sys/vm/drop_caches

Você considera que isso é uma boa solução?

Nota: /proc/sys/vm/drop_caches parece ser o que o Ubuntu usa, e não se espera que seja uma abordagem que funcione em todos os Unixes (embora talvez em todos os Linux). Estou mencionando isso depois de ter lidohttps://ubuntuforums.org/showthread.php?t=589975e, depois de ler um relatório inicial questionando a segurança de fazer isso, lendo mais postagens no fórum que confirmam sua segurança.

informação relacionada