Estamos executando um script de backup que primeiro copia um arquivo para um destino e depois tar
o 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 cp
comando 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 sleep
comando entre as linhas rsync
/ cp
e tar
, o aviso não aparece, mas considero esta uma solução não muito limpa.
Alguns fatos:
- Tentei adicionar um
sync
comando entre os comandosrsync
etar
com 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, tar
não vou começar até rsync
terminar.
A outra solução é enviar o cp
/ rsync
para 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 rsync
linha envia a execução para segundo plano (torna-se umcriançada sessão atual) e então wait
forç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.