파일을 삭제했는데 다음과 같이 표시됩니다.
$ ls
total 64
-rw-rw-r-- 1 502 17229 Sep 17 16:42 page_object_methods.rb
drwxrwxr-x 7 502 238 Sep 18 18:41 ../
-rw-rw-r-- 1 502 18437 Sep 18 18:41 new_page_object_methods.rb
-rw-r--r-- 1 502 16384 Sep 18 18:42 .nfs0000000000b869e300000001
drwxrwxr-x 5 502 170 Sep 21 13:48 ./
13:48:11 *vagrant* ubuntu-14 selenium_rspec_conversion
삭제하려고 하면:
$ rm .nfs0000000000b869e300000001
rm: cannot remove ‘.nfs0000000000b869e300000001’: Device or resource busy
이것은 무엇을 의미 하는가? 나는 무엇을 해야 합니까?
답변1
파일이 프로세스에 의해 열려 있는 동안에는 파일을 삭제할 수 있습니다. 이런 일이 발생하면 디렉터리 항목은 삭제되지만 파일 자체(inode 및 내용)는 그대로 유지됩니다. 파일은 더 이상 링크가 없고 어떤 프로세스에서도 열리지 않는 경우에만 실제로 삭제됩니다.
NFS는 상태 비저장 프로토콜입니다. 작업은 이전 작업과 독립적으로 수행될 수 있습니다. 서버를 다시 시작할 수도 있으며, 다시 온라인 상태가 되면 클라이언트는 이전처럼 계속 파일에 액세스할 수 있습니다. 이것이 작동하려면 파일을 열어서 얻은 핸들(서버가 다시 시작되면 잊어버리게 됨)이 아닌 이름으로 파일을 지정해야 합니다.
두 가지를 종합해 보면 클라이언트가 파일을 열고 삭제하면 어떻게 될까요? 이 파일은 보관해야 합니다.이름, 이를 연 클라이언트가 계속 액세스할 수 있도록 합니다. 그러나 파일이 삭제되면 이후에는 해당 이름의 파일이 존재하지 않을 것으로 예상됩니다. 따라서 NFS 서버는삭제열린 파일을 다음으로 변환이름 바꾸기:파일 이름이 .nfs…
( .nfs
뒤에 문자와 숫자가 이어짐)으로 변경됩니다.
이러한 파일은 삭제할 수 없습니다(시도하면 .nfs…
새 파일이 다른 접미사로 표시됩니다). 파일을 연 클라이언트가 파일을 닫으면 결국 사라집니다. (파일을 닫기 전 클라이언트가 사라지면 서버가 이를 인지하기까지 다소 시간이 걸릴 수 있습니다.)
답변2
@mtak 사용자가 다른 질문을 제안했습니다.
You could try running
퓨저/경로/to/.nfsto check which process is using the .nfs file. – mtak May 2 '14 at 9:13
^^^^^ 작동합니다^^^^^ 문제가 있는 프로세스를 종료하여 파일 핸들을 해제합니다.
예를 들어
$ rm -rf ~/Downloads
rm: cannot remove ‘/nfshome/x/Downloads’: Directory not empty
$ ls -alstr ~/Downloads
total 38864
972 -rw-r--r-- 1 x users 988438 Dec 20 2016 .nfs00000000018d307a00000369
31812 -rw-r--r-- 1 x users 32503812 Dec 20 2016 .nfs00000000018d307f0000036b
636 drwx--x--x 134 x y 647168 Aug 28 10:37 ..
240 drwxr-xr-x 2 x y 241664 Aug 28 10:43 .
$ rm -rf ~/Downloads
rm: cannot remove ‘/na-homes/x/Downloads/.nfs00000000018d307a00000369’: Device or resource busy
rm: cannot remove ‘/na-homes/x/Downloads/.nfs00000000018d307f0000036b’: Device or resource busy
$ fuser /nfshome/x/Downloads/.nfs00000000018d307400000367
/nfshome/x/Downloads/.nfs00000000018d307400000367: 8231m
$ ps -elf |grep 8231
0 S x 1493 15153 0 80 0 - 28177 pipe_w 10:55 pts/39 00:00:00 grep --color=auto 8231
0 S x 8231 7660 0 99 - - 481464 poll_s Jul19 ? 00:06:01 /usr/libexec/tracker-extract
$ kill 8231
$ kill 8231 # kill twice to check first kill worked, . .
# escalate to kill -9 8231 if first kill didn't work, . .
# use sudo or root or other user to kill if ownership prevents kill working.
-bash: kill: (8231) - No such process
$ rm -rf ~/Downloads
$ ls -alstr ~/Downloads/
ls: cannot access /nfshome/x/Downloads/: No such file or directory
응! 성공.
물론 YMMV. 다른 프로세스에서 파일을 열 수 있습니다.
추적기 추출 프로세스를 종료하면 자동으로 다시 시작됩니다.
이 추적기 추출물은 무엇입니까? (나는 이것을 centos/redhat에서 보았다)
extra/tracker 1.2.3-1 (gnome)
All-in-one indexer, search tool and metadata database
답변3
NFS는 "상태 비저장"이므로 파일을 여는 UNIX 방법을 에뮬레이트한 다음 파일을 삭제하고 열린 파일 핸들을 유지하는 방법이 필요합니다.
NFS 파일 작업을 수행하면 체인이 생성됩니다.
open(); seek-last-off(); doit(); close();
실행 중이므로 서버가 다시 시작된 후에도 NFS가 지속됩니다.
이전 파일을 연 클라이언트 프로세스가 종료되면 해당 파일은 사라집니다.
적절하게 구현된 파일 서버는 일주일이 지난 모든 파일을 삭제하는 스크립트를 매일 밤 실행합니다. 그 이유는 해당 파일을 유지한 채 클라이언트를 다시 시작하면 해당 파일은 영원히 유지되기 때문입니다.
답변4
저도 비슷한 상황에 직면했는데 제 경우에는 제가 만든 프로그램으로 만든 파일을 삭제할 수 없었습니다. 내 프로그램에서 생성한 디렉토리에 그것이 존재하기 때문에 나는 이것을 확신합니다. 이 프로그램을 언제 어디서 실행했는지는 알 수 없습니다. 해결책: 방금 모든 터미널을 종료했습니다. 다시 로그인해서 파일을 삭제했습니다.
PS 내 대답은 내가 지정한 시나리오에만 적용됩니다.