삭제가 병렬로 발생하면 rm -rf가 실패합니다.

삭제가 병렬로 발생하면 rm -rf가 실패합니다.

rm -rf동일한 파일 트리를 삭제하려고 하면 실패합니다( rm파일이 먼저 열거된 다음 삭제되기 때문인 것 같습니다).

간단한 테스트:

# 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

예를 들어 stderr에 대한 일부 출력이 있습니다.

...
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

모든 stderr 출력을 리디렉션하여 무시할 수 있지만 /dev/null삭제는 /tmp/dirtest실제로 실패합니다! 두 명령이 모두 완료된 후에도 /tmp/dirtest여전히 존재합니다.

rm디렉토리 트리를 올바르게 삭제하고 실제로 모든 오류를 무시하는 방법은 무엇입니까 ?

답변1

젠장. 그러나 어떤 의미에서는 두 개의 동시 프로세스가 디렉토리 트리를 조작할 때 문제가 발생하는 것입니다. Unix는 개별 파일에 대한 원자적 작업을 위한 기본 요소를 제공하지만 전체 디렉터리 트리에서는 제공하지 않습니다.

간단한 해결 방법은 스크립트를 삭제하기 전에 디렉터리 이름을 바꾸도록 하는 것입니다. 사용 사례에는 공동 작업 스크립트가 있으므로 새 이름을 예측할 수 있습니다.

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

rm어쩌면 빌드가 CPU 집약적인 작업을 수행하는 동안 나중에 백그라운드에서 이 작업을 수행 할 수도 있습니다 .

답변2

빌드 시스템이 어떻게 이렇게 되었는지 궁금합니다. 바꿀 수 있나요? 최소한 다른 스크립트가 이미 작업을 수행하고 있음을 스크립트에 알리는 플래그를 만들 수 있습니다.

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

필요하지 않도록 다시 빌드하는 것이 좋습니다.

관련 정보