du não pode acessar o arquivo - Nenhum arquivo ou erro de diretório

3

Eu tenho muitas subpastas dentro de uma pasta específica que, por sua vez, contém muitos arquivos menores. Eles são criados programaticamente e, portanto, não sei quantos deles estão lá dentro.

Eu decidi remover todas essas subpastas e arquivos e então eu emiti o comando

rm -rf foldername/

No entanto, o comando rm está demorando tanto para ser executado, o que acredito ser perfeitamente normal, já que é necessário desvincular todos os arquivos.

Mas, decidi verificar se o tamanho dessa pasta está sendo reduzido emitindo o comando

du -sh foldername/

No entanto, o comando acima me dá o erro como

du: cannot access 'foldername/file': No such file or directory

Por que esse erro está acontecendo?

    
por Ramesh 28.06.2014 / 05:16

2 respostas

1

du , como qualquer comando que percorra árvores de diretórios de maneira recursiva, opera da seguinte maneira:

  1. Leia informações sobre um arquivo, acessado pelo caminho¹. No caso de du , a chamada ao sistema stat fornece o tipo de arquivo (em particular, se é um diretório) e tamanho. Inicialmente, os nomes são retirados da linha de comando.
  2. Se o arquivo for um diretório, abra e ler a lista de nomes de arquivos.
  3. Para cada nome de arquivo no diretório, construa um caminho de arquivo ( DIRECTORY/ENTRY_NAME ) e aja recursivamente a partir da etapa 1. Essa etapa pode ser executada parcialmente em paralelo com a anterior (depende da implementação).

rm está em execução e excluindo arquivos um por um. Ocasionalmente, du lê um nome de arquivo na etapa 2, mas, quando chega a hora de processá-lo na etapa 3, rm o excluiu. Se você vê esse erro e quantas vezes depende da velocidade relativa de rm e du e é praticamente imprevisível.

¹ Existem apenas duas maneiras de acessar diretamente um arquivo: por caminho (incluindo informações de diretório, relativo ou absoluto) ou (se o arquivo estiver aberto) pelo descritor.

    
por 29.06.2014 / 00:28
0

Apenas ignore o erro do comando du

De acordo com este link, eu poderia ignorar o du erros apenas mencionando,

du 2> >(grep -v '^du: cannot \(access\|read\)' >&2)

Mas estou mais especificamente interessado em saber o que está acontecendo com a exclusão de arquivos. Estou particularmente interessado em saber por que o comando du não pôde fornecer o tamanho e porque relata o erro quando o comando rm desvinculou os arquivos.

Isto é explicado em este link . Eu estou apenas reformulando para ver o que aconteceu aqui.

  1. O comando rm desvinculou o arquivo. (ou seja, excluir o nome do arquivo entrada de seu diretório pai).
  2. Mas, o identificador de arquivo ainda permanece válido, embora não haja arquivo nome associado a ele. É aqui que o comando du informa que não vê o arquivo ou diretório.

Verificação

Fiz mais algumas pesquisas para verificar se os arquivos estão, de fato, desvinculados.

Eu obtive o pid do processo rm usando o comando ps . Agora, eu emiti o comando abaixo para ver se os arquivos ainda estão disponíveis.

lsof +L | grep 11771

O comando acima me deu a saída abaixo.

rm   11771  root  4r DIR  8,17 175882240     2   47333397 /foldername/filename

Assim, conforme a saída acima, o arquivo é desvinculado.

Como o comando rm ainda está em execução, o comando du relata o erro.

    
por 28.06.2014 / 05:16

Tags