Acabei de pegar um erro confuso:
rm: cannot remove `xxx/app/cache/prod': Directory not empty
que foi causado pelo seguinte comando:
rm -rf $cache_dir/*
onde $cache_dir
é definido comoxxx/app/cache
Então, eu vejo como: rm
removeu tudo no cache/prod
diretório e logo antes de tentar remover o cache/prod
diretório - outro programa criou um arquivo / diretório dentro dele, causando rm
falha.
Minha suposição está correta?
rm -r
não é atômica. Se quiser ter certeza de que não há mais arquivos criados no diretório enquanto esterm -rf
estiver em execução, renomeie-o primeiro e remova o diretório renomeado.rm -rf
segurança de threads: se você executá-lo várias vezes simultaneamente no mesmo diretório, o diretório será excluído. Trata-se derm -r
não ser atômico.rm
invocação, poderemos falar sobre segurança de threads. Mas de qualquer maneira, isso não muda nadaRespostas:
A mensagem de erro fornecida foi "Diretório não vazio" (
ENOTEMPTY
), considerando que sua suposição parece correta, que é uma condição de corrida em que um programa criou um arquivo nesse diretório antes derm
tentar remover o diretório, fornecendo oENOTEMPTY
erro esperado do subjacentermdir(2)
.NOTA: Para estar seguro, você pode mover / renomear o diretório para um novo nome e, em seguida, executar sua exclusão deste diretório.
fonte
mkdir x; cat > x/a &; tail -f x/a &; rm -r x
mostra que um diretório pode ser removido mesmo quando os arquivos estão em uso, independentemente de estarem abertos para leitura ou gravação.rm
reclama de erros de permissão, então acho que podemos eliminar isso. Não estou confiante o suficiente para postar uma resposta.