删除流浪者文件,我看到.nfs0000000000b869e300000001


15

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

$ 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

这说明什么?我该怎么办


这个问题,再加上指示器声音服务错误,其中有数百个进程使文件保持打开状态,再加上类似 这样的问题,其中〜/ .cache / upstart日志变得非常大,然后被压缩,这些问题占用了我很大的空间。包含我的主目录的公司NFS驱动器。通过添加ps -Af | grep 'indicator-services-start' | awk '{ print $2 }' | xargs kill到解决crontab -e
安德烈斯·里奥弗里奥

Answers:


14

可以在打开文件时将其删除。发生这种情况时,将删除目录条目,但文件本身(inode和内容)保留在后面;只有在没有更多链接且任何进程都无法打开该文件时,该文件才会真正删除。

NFS是无状态协议:操作可以独立于先前的操作执行。服务器甚至有可能重新启动,一旦重新联机,客户端将继续像以前一样访问文件。为了使它起作用,必须使用文件名而不是通过打开文件获得的句柄来指定文件(服务器在重新启动时会忘记该文件)。

将两者放在一起:当客户端打开文件并删除文件时会发生什么?该文件需要保持名称,以便打开它的客户端仍然可以访问它。但是,删除文件后,以后将不会再有该名称的文件存在。因此,NFS服务器将打开文件的删除转变为重命名:文件被重命名为.nfs….nfs后跟字母和数字字符串)。

您无法删除这些文件(如果尝试这样做,则所发生的只是.nfs…带有不同后缀的新文件出现)。当打开该文件的客户端将其关闭时,它们最终将消失。(如果客户端在关闭文件之前消失,则可能需要一段时间,直到服务器发出通知。)


2

用户@mtak在另一个问题上建议:

You could try running热熔器/path/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上看到了)

/programming/26737900/tracker-extract-and-tracker-store-processes-using-huge-amount-of-ram

extra/tracker 1.2.3-1 (gnome)
    All-in-one indexer, search tool and metadata database

1
比已接受的答案有用得多,因为它为用户提供了一种解决情况的方法。
CHB

1

由于NFS是“无状态的”,因此需要一种方法来模拟UNIX打开文件的方法,然后通过保留打开的文件句柄将其删除。

任何NFS文件操作都会导致该链:

open(); seek-last-off(); doit(); close();

可以运行,这就是NFS在服务器重新启动后仍然可以生存的原因。

一旦客户端上打开旧文件的进程终止,该文件将消失。

正确实现的文件服务器每晚都会运行一个脚本,该脚本将删除所有早于一周的此类文件。原因是,如果客户端在保存此类文件的同时重启,该文件将永久保留。


0

其他一些过程可能仍在使用该文件(即,具有打开的文件句柄)。要么忽略该文件,要么使用lsof或类似方法尝试查找打开该文件的进程(或重新启动所有文件!)。


0

我遇到了类似的情况,但就我而言,我无法删除自己程序创建的文件。我确信这是因为它存在于我的程序创建的目录中。我不知道何时何地运行该程序。解决方案:我只是从所有终端退出。我再次登录,只是删除了文件。

PS我的答案仅对我指定的场景有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.