기술 · 실용 가이드
rm -rf에도 “Directory not empty”? 되살아나는 항목의 소유자를 증명하세요
같은 directory인지, 어떤 entry가 남거나 다시 만들어지는지, 소유자가 process·mount·NFS server·FUSE driver 중 무엇인지 알기 전에는 파괴적 명령을 반복하지 마세요.

같은 directory인지, 어떤 entry가 남거나 다시 만들어지는지, 소유자가 process·mount·NFS server·FUSE driver 중 무엇인지 알기 전에는 파괴적 명령을 반복하지 마세요.
ENOTEMPTY는 삭제 시 entry가 남았음을 뜻하지만 소유자를 알려주지 않습니다. 비어 보이는 기본 listing은 dotfile을 빼며 remote/concurrent state를 증명하지 않습니다.
1. 대상 identity 고정
정확한 command, stderr, exit status, absolute path, parent, device, inode, filesystem type과 mount source를 저장합니다. symlink를 비파괴적으로 해석해 실패 이름이 같은 object인지 확인합니다.
비어 보이는 ls만으로 안전을 추정하지 마세요. 다른 container나 mount namespace, bind mount 또는 시도 사이의 이름 교체가 있을 수 있습니다.
2. 모든 entry를 두 번 캡처
dot entry와 이상한 byte name을 나열하되 출력을 rm에 넣지 않습니다. 이름, metadata, device/inode의 시간 기록 snapshot을 두 번 만들어 안정 child와 재생성 이름을 구분합니다.
ENOTEMPTY는 삭제 시 entry가 남았다는 뜻일 뿐 원인을 말하지 않습니다. 다음 작업 전 정확한 child name과 .nfs/.fuse_hidden pattern을 보존합니다.
3. 되돌아오는 entry 소유자 분류
일반 local entry는 생성 application/job을 찾습니다. .nfs/.fuse_hidden은 underlying file을 연 process를 찾습니다. NFS는 storage owner와 client/server view를 비교합니다.
관련 없는 process를 kill하지 말고 sudo가 filesystem state를 바꾼다고 가정하지 마세요. creator나 remote/userspace filesystem이 이름을 즉시 되돌릴 수 있습니다.
4. 최소 수리 적용
증명된 writer를 중지하고 handle을 닫거나 storage owner가 remote/FUSE state를 고칩니다. 검증된 child와 directory만 삭제하고 경로를 넓히거나 filesystem을 넘지 않습니다.
directory 교체가 승인되면 owner, mode, ACL, label, mount role, service ownership을 먼저 기록합니다. pathname 재생성은 같은 계약이 아닙니다.
5. 부재 검증과 증거 보존
삭제 후 snapshot을 다시 만들고 알려진 writer/cache interval을 기다린 뒤 같은 namespace와 authoritative storage view에서 계속 없는지 확인합니다.
원래 errno, 책임 process/storage layer, action, 관련 hash/metadata와 rollback을 기록합니다. 반복 NFS/FUSE divergence나 I/O error를 retry loop로 숨기지 않습니다.
