删除流浪文件我看到 .nfs0000000000b869e300000001

删除流浪文件我看到 .nfs0000000000b869e300000001

我删除了一个文件,现在我看到:

$ 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上看到这个)

https://stackoverflow.com/questions/26737900/tracker-extract-and-tracker-store-processes-consuming-huge-amount-of-ram

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我的回答仅适用于我指定的场景。

相关内容