저는 macOS 및 rm
GNU coreutils(macOS 자체 도구 아님 rm
)의 도구를 사용합니다.
그래서 다음과 같은 일부 디렉토리를 정리하는 스크립트가 있습니다.
if [ -d "${cleanup_repo_clone_root}" ]; then
echo "Cleaning up tmp directory: ${cleanup_repo_clone_root}"
set -x; rm -rf -- "${cleanup_repo_clone_root}"
fi
나는 set -x
무슨 일이 일어났는지 보기 위해 하나를 던졌다.
출력이 표시됩니다.
+ set -x
+ rm -rf -- /var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ
rm: cannot remove '/var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ': Directory not empty
하지만 해당 rm 명령을 복사하여 붙여넣고 실행하면 제대로 작동합니다!
$ rm -rf -- /var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ
여기서 무슨 일이 일어나고 있는 걸까요?
답변1
rm
여러 파일이나 디렉터리에서 작업할 때의 작업은 원자적이지 않습니다. 이 경우 rm -r
파일과 디렉터리가 아래에서 위로 검색되어 루트까지 요청된 경로의 리프에서 제거되기 때문에 이것이 중요합니다 . 아무것도 남지 않을 때까지 unlink
ing 및 ing를 수행한 다음 최종 디렉토리를 수행합니다 .rmdir
rmdir
이러한 일은 순서대로 발생하므로 를 내보내기 전에 더 많은 파일이 생성되면 rmdir
다시 돌아옵니다 ENOTEMPTY
("디렉토리가 비어 있지 않습니다").
시스템에서 실행 중인 스크립트나 다른 프로세스가 와 상호 작용할 가능성이 높습니다 rm -rf
.
- 비동기식 대신 동기식으로 수행하거나
- ENOTEMPTY로 인해 실패하면 다시 시도하십시오.
rm -rf
(디렉토리가 그 아래에서 제거되었기 때문에 다른 응용 프로그램이 실패할 수도 있지만)
fanotify
opensnoop
유사한 eBPF 스크립트를 사용하여 다음과 같은 파일을 생성하는 다른 애플리케이션을 찾을 수 있습니다.숨은참조. inotify
도움이 될 수도 있지만 안타깝게도 출력에 파일을 생성하는 프로세스가 포함되어 있지 않습니다.
또 다른 가능성은 파일 삭제에 실패했지만 차단되었을 수 있다는 것입니다 . 이 경우 어떤 오류가 발생할 수 있는지 확인하려면 -f
파일 없이 실행해 보세요 .-f
답변2
open $dir
이전에 제가 한 호출은 제가 삭제하려는 디렉터리의 하위 디렉터리 중 하나에서 macOS Finder(파일 탐색기 데스크톱 앱)를 실행하는 것이었습니다 .
Directory not empty
삭제하려는 디렉터리에 파일/디렉터리를 잠그는 프로세스가 있는 경우 macOS에서 이 알 수 없는(ENOEMPTY) 오류가 발생하는 것 같습니다.