Patrick tem mais ou menos correto, mas aqui está o porquê. A maneira como você copia um arquivo no UNIX funciona assim:
- Tente ler alguns (mais) bytes de
fileA
.
- Se não obtivermos bytes porque estamos no (ou passado) o final do arquivo, terminamos; saia.
- Caso contrário, grave os bytes em
fileB
e retorne ao passo 1.
Sabendo disso, e sabendo que é tão simples quanto isso, vamos ver alguns casos extremos.
Assim que encontrarmos o final do arquivo, a cópia está pronta. Então, digamos que nosso arquivo está crescendo durante a cópia, mas está crescendo mais lentamente do que estamos copiando. O programa de cópia continuará passando do tamanho do arquivo original, porque quando chega lá, há mais no arquivo. Mas em algum momento, ele alcança o final do arquivo, e ele sabe que está no final porque não pode ler mais bytes agora . Então, ele sai, mesmo que o arquivo esteja prestes a crescer.
Se o arquivo estiver truncado, o programa de cópia diz "Whoa, eu passei do final do arquivo!" e sai.
E se partes do arquivo estão sendo atualizadas aleatoriamente por, digamos, um programa de banco de dados :-), então sua cópia será uma mistura de dados antigos e novos, porque os dados não são todos copiados ao mesmo tempo Tempo. O resultado provavelmente será uma cópia corrompida, e é por isso que geralmente não é uma boa ideia fazer cópias de bancos de dados ao vivo.
(Dito isto, não estou familiarizado com o CouchDB, e é possível projetar um banco de dados para resistir a esse tipo de corrupção. Mas é melhor ter certeza absoluta.)