Qual é a razão pela qual “rm -rf a / b” diz que “a / b não está vazia”?

7

O seguinte script às vezes me oferece coisas como can't remove a/b as it's not empty

ssh -T user@host <<EOF
  cd somewhere
  rm -rf a/b    
EOF

Mas eu faço login no servidor e executo rm -rf a/b , então eu nunca tive o problema.

Existem outros processos que estão gerando arquivos para a/b , isso está relacionado?

De qualquer forma, como criar um script que garanta que "a / b" seja excluído?

    
por Cheng 04.05.2011 / 18:00

2 respostas

6

rmdir(2) falhará se o diretório não estiver vazio. Se outro processo estiver criando arquivos enquanto rm(1) estiver removendo-os, ele não saberá excluí-los e, consequentemente, quando chegar a hora de rm(1) tentar excluir o que acredita que deveria ser um diretório vazio, ele falhará com o erro você postou.

Uma forma de excluir o diretório em face das criações de arquivos simultâneos no diretório é renomeá-lo:

mv a a~
rm -rf a~

É possível que isso não funcione se os processos que criam os arquivos em a/b não o fizerem por caminho ( open(2) vs. openat(2) ).

Estou assumindo que o (s) processo (s) que cria arquivos em a/b recriará esse diretório se ele não existir ou manipulará a falha normalmente se não existir. Como você já está tentando excluir o diretório de outros processos, isso parece uma suposição segura.

    
por 05.05.2011 / 09:21
15

There are other processes that are generating files to a/b, is that related?

Muito possivelmente. Pode ser que rm -rf primeiro remova todos os arquivos e, em seguida, remova todos os diretórios. Sob o capô, a chamada do sistema rmdir para remover um diretório falhará se o diretório não estiver vazio. Você pode ter uma condição de corrida acontecendo, em que rm -rf verifica se o diretório está vazio e está; outro processo cria um novo arquivo; finalmente rm -rf chama rmdir , mas outro processo cria um arquivo antecipadamente.

O conselho de Faheem é bom: coloque um ls na sua condição de erro

ssh -T user@host <<EOF
  cd somewhere
  rm -rf a/b || ( ls -a a/b && exit 1 )
EOF
    
por 04.05.2011 / 20:21

Tags