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
필요하지 않도록 다시 빌드하는 것이 좋습니다.