rm -rf falhando se apagar em paralelo

4

rm -rf falhará se algo tentar excluir a mesma árvore de arquivos (acho que rm enumera os arquivos primeiro e exclui).

Um teste simples:

# Terminal 1
for i in 'seq 1 1000'; do mkdir -p /tmp/dirtest/$i; done

# Now at the same time in terminal 1 and 2
rm -rf /tmp/dirtest

Haverá algum resultado em stderr, por exemplo:

...
rm: cannot remove directory '/tmp/dirtest/294': No such file or directory
rm: cannot remove directory '/tmp/dirtest/297': No such file or directory
rm: cannot remove directory '/tmp/dirtest/304': No such file or directory

Eu posso ignorar toda a saída stderr, redirecionando-a para /dev/null , mas a remoção de /tmp/dirtest na verdade falha! Depois que os dois comandos terminarem, /tmp/dirtest ainda estará lá.

Como posso fazer rm excluir a árvore de diretórios corretamente e realmente ignorar todos os erros?

    
por Alex B 04.03.2011 / 02:41

2 respostas

5

Desagradável. Mas de certo modo, você está procurando problemas quando dois processos concorrentes estão manipulando uma árvore de diretórios. O Unix fornece primitivas para manipulação atômica de um único arquivo, mas não para árvores inteiras de diretório.

Uma solução simples seria o seu script renomear o diretório antes de removê-lo. Como o seu caso de uso tem scripts cooperativos, é aceitável que o novo nome seja previsível.

mv /build/tree /build/tree.rm.$$
mkdir /build/tree
rm -rf /build/tree.rm.$$

Talvez você possa até mesmo fazer o rm em segundo plano, enquanto sua compilação executa algumas tarefas vinculadas à CPU.

    
por 04.03.2011 / 21:20
1

Estou curioso em saber como o sistema de compilação acabou assim. Você é capaz de mudar isso? No mínimo, você pode criar um sinalizador que permita que os scripts saibam que o outro já está realizando o trabalho ...

mkdir /tmp/flag.rmdirtest && rm -rf /tmp/dirtest && rmdir /tmp/flag.rmdirtest

Seria melhor reformular a coisa para que isso não seja necessário.

    
por 04.03.2011 / 17:18