Considere os dois comandos abaixo que estão programados para serem executados ao mesmo tempo (via Autosys, exatamente às 8h).
O find
comando removeu arquivos com mais de 15 dias, mas saiu com status diferente de zero com:
???find missing /app/source/a.txt no such file or directory
No entanto, a.txt
tem um dia de idade. Por que o find
comando está validando um arquivo recente que estava presente durante sua execução, mas foi movido para outra pasta ao mesmo tempo?
find /app/source -type f -name -mtime +15 rm -f {} \;
mv /app/source/a.txt /app/backup/
Isso é o que é conhecido como uma condição de corrida . A única maneira de
find
saber que este é um arquivo novo que não deve ser excluído é olhando para o arquivo. Então,find
primeiro encontre o arquivo, depois verifique sua data.No seu caso, parece que seu outro comando apagou o arquivo depois de
find
ver que ele estava presente no diretório, mas antes de ter tempo de verificar sua idade. Daí o erro.Um diretório é basicamente uma lista de nomes de arquivos. Quando você executa
find
e especifica testes que olham para atributos/propriedades de arquivo (em vez de apenas nome de arquivo),find
deve consultar o sistema de arquivos para os atributos/propriedades de cada arquivo listado em cada diretório. Portanto,find
não há como saber quea.txt
é um arquivo recente, a não ser chamandostat("a.txt")
.Como você provavelmente entendeu, seu
mv
comando moveu o arquivo entre o momento em quefind
leu o diretório e o momento em que chamoustat()
.