du가 파일에 액세스할 수 없습니다. 해당 파일이나 디렉터리가 없습니다. 오류

du가 파일에 액세스할 수 없습니다. 해당 파일이나 디렉터리가 없습니다. 오류

특정 폴더 안에는 더 작은 파일이 많이 포함된 하위 폴더가 많이 있습니다. 프로그래밍 방식으로 생성되므로 내부에 몇 개가 있는지 알 수 없습니다.

나는 이 하위 폴더와 파일을 모두 제거하기로 결정하고 다음 명령을 실행했습니다.

rm -rf foldername/

그러나 rm 명령은 실행하는 데 너무 많은 시간이 걸리며 이는 모든 파일의 링크를 해제해야 하기 때문에 완전히 정상이라고 생각합니다.

하지만 다음 명령을 실행하여 이 폴더의 크기가 줄어들고 있는지 확인하기로 결정했습니다.

du -sh foldername/

그러나 위 명령을 실행하면 다음과 같은 오류가 발생합니다.

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

이 오류가 발생하는 이유는 무엇입니까?

답변1

du는 디렉터리 트리를 재귀적으로 순회하는 모든 명령과 마찬가지로 다음과 같은 방식으로 작동합니다.

  1. 경로1를 통해 액세스되는 파일에 대한 정보를 읽습니다. 의 경우 du시스템 호출stat파일 유형(특히 디렉터리인지 여부)과 크기를 제공합니다. 처음에 이름은 명령줄에서 가져옵니다.
  2. 파일이 디렉터리인 경우열려 있는그것과읽다파일 이름 목록.
  3. 디렉터리의 각 파일 이름에 대해 파일 경로( )를 구성하고 1단계부터 반복적으로 작업을 수행합니다. 이 단계는 부분적으로 이전 단계와 병렬로 수행될 수 있습니다(구현에 따라 다름).DIRECTORY/ENTRY_NAME

rm파일을 하나씩 실행하고 삭제하고 있습니다. 때때로 du2단계에서 파일 이름을 읽지만 3단계에서 처리할 때쯤에는 rm파일을 삭제합니다. 이 오류가 표시되는지 여부와 횟수는 rmand 의 상대 속도에 따라 달라지며 du거의 예측할 수 없습니다.

¹ 파일에 직접 액세스하는 방법은 경로(상대 또는 절대 디렉터리 정보 포함) 또는 설명자(파일이 열려 있는 경우)의 두 가지뿐입니다.

답변2

du 명령 오류를 무시하십시오.

에 따라이것du링크 에 언급만 하면 오류를 무시할 수 있습니다 .

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

그러나 나는 파일 삭제로 인해 무슨 일이 일어나고 있는지 아는 데 더 관심이 있습니다. 특히 du명령이 크기를 제공할 수 없는 이유와 rm명령이 파일 연결을 해제할 때 오류를 보고하는 이유를 알고 싶습니다 .

이에 대한 설명은 다음과 같습니다.이것링크. 나는 여기서 무슨 일이 일어났는지 보기 위해 다시 설명하고 있습니다.

  1. 명령 이 rm파일의 링크를 해제했습니다. (즉, 상위 디렉토리에서 파일 이름 항목을 삭제합니다.)
  2. 그러나 연결된 파일 이름이 없더라도 파일 핸들은 여전히 ​​유효한 상태로 유지됩니다. 이는 du명령이 파일이나 디렉터리를 볼 수 없다고 보고하는 곳입니다 .

확인

파일이 실제로 연결 해제되었는지 확인하기 위해 좀 더 조사했습니다.

pid명령을 사용하여 rm 프로세스를 얻었습니다 ps. 이제 파일이 여전히 사용 가능한지 확인하기 위해 아래 명령을 실행했습니다.

lsof +L | grep 11771

위의 명령은 나에게 아래 출력을 제공했습니다.

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

따라서 위 출력에 따라 파일의 링크가 해제됩니다.

명령 rm이 계속 실행 중이므로 du명령이 오류를 보고합니다.

관련 정보