files – NFS mount:设备或资源繁忙

我提到了以下链接,解决方案有效.

How to get over “device or resource busy”?

手动删除文件时,上述解决方案有效.但是我有一个删除文件的python脚本(自动进程).当脚本尝试删除文件时,有时会出现“设备或资源繁忙错误”.因此,我的脚本失败了.我不知道如何使用我的python脚本解决这个问题.

编辑:
该脚本从日志服务器下载日志文件.然后我的脚本处理这些文件.处理完成后,脚本将删除这些日志文件.我认为设计没有任何问题.

确切错误:

OSError: [Errno 16] Device or resource busy: '/home/johndoe/qwerty/.nfs000000000471494300000944'
最佳答案
这些文件是NFS占位符:

/home/johndoe/qwerty/.nfs000000000471494300000944

一些背景

在典型的UNIX文件系统中,可以删除当前正在使用和打开的文件,但其内容实际上不会消失,直到关闭它的最后一个文件句柄.您可以使用以下代码查看此操作:

$ps -ef >/tmp/temporaryfile
$ls -l /tmp/temporaryfile
-rw-r--r-- 1 roaima roaima 6758 Mar  2 14:02 /tmp/temporaryfile

$( sleep 60 ; cat ) </tmp/temporaryfile &
[1] 4864

$rm /tmp/temporaryfile
$ls -l /tmp/temporaryfile
ls: cannot access /tmp/temporaryfile: No such file or directory

$fg    # Wait for the rest of the minute
( sleep 60; cat ) < /tmp/temporaryfile
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:44 ?        00:00:02 init [2]
root         2     0  0 09:44 ?        00:00:00 [kthreadd]
root         3     2  0 09:44 ?        00:00:00 [ksoftirqd/0]
root         5     2  0 09:44 ?        00:00:00 [kworker/0:0H]
...
roaima    4857  4786  0 14:02 pts/1    00:00:00 -bash
roaima    4858  4857  0 14:02 pts/1    00:00:00 ps -ef

(请注意,这与Microsoft Windows相反,后者在文件仍处于打开状态时无法删除.)

说明

NFS服务器上的文件可能有一个或多个客户端访问它. NFS本身(大部分)是无状态的,因此需要模拟允许打开文件被删除后才能访问的功能.

通过从文件系统中的位置删除文件来处理仿真,但将其保留为名称以.nfs开头的文件.当最后一个读取器/写入器将其文件句柄关闭到该文件时,它将从文件系统中正确删除.

以下是此操作的示例:

$ps -ef > /var/autofs/net/nfsserver/tmp/temporaryfile
$ls -l /var/autofs/net/nfsserver/tmp/temporaryfile
-rw-r--r-- 1 roaima roaima 6766 Mar  2 14:14 /var/autofs/net/nfsserver/tmp/temporaryfile

$( sleep 60 ; cat ) </var/autofs/net/nfsserver/tmp/temporaryfile &
[1] 4987

$rm /var/autofs/net/nfsserver/tmp/temporaryfile
$ls -l /var/autofs/net/nfsserver/tmp/temporaryfile
ls: cannot access /var/autofs/net/nfsserver/tmp/temporaryfile: No such file or directory

$ls -lA /var/autofs/net/nfsserver/tmp/
total 8
-rw-r--r-- 1 roaima roaima 6766 Mar  2 14:14 .nfs000000000100000300000001

$rm /var/autofs/net/nfsserver/tmp/.nfs000000000100000300000001
rm: cannot remove ‘/var/autofs/net/nfsserver/tmp/.nfs000000000100000300000001’: Device or resource busy

$fg    # Wait for the rest of the minute
( sleep 60; cat ) < /var/autofs/net/nfsserver/tmp/temporaryfile
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:44 ?        00:00:02 init [2]
root         2     0  0 09:44 ?        00:00:00 [kthreadd]
root         3     2  0 09:44 ?        00:00:01 [ksoftirqd/0]
...
roaima    4983  4712  0 14:14 pts/0    00:00:00 ps -ef

推论

您应该忽略名称以.nfs开头的NFS挂载上的文件.此外,您的代码需要应对在所有这些文件实际消失之前无法删除远程目录的可能性.

NFS并不像人们希望的那样对应用程序透明.

评论

可能是日志文件仍处于打开状态的原因是远程系统上的记录器进程仍在使用它们.通常,这种方法是循环日志文件,只下载和删除以前的日志文件,将当前日志文件留在文件系统中供记录器进程使用.

诸如logrotate之类的实用程序使用特定的配置元素(例如,延迟压缩)来处理此问题,这些元素(尝试)确保日志文件在仍在使用时不会被压缩. (有关示例,请参阅至少Debian系统上的/etc/logrotate.d/apache2.)

转载注明原文:files – NFS mount:设备或资源繁忙 - 代码日志