我删除了一个文件,现在我看到:
$ 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
定影器/路径/到/.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我的回答仅适用于我指定的场景。