确定 NFS 共享上的文件是否正在使用

确定 NFS 共享上的文件是否正在使用

设想:

我们使用 NFS 共享来允许客户端上传原始视频材料。然后从 (NFS) 服务器上的目录中轮询文件以进行处理。由于我们不想处理尚未完成上传的文件,因此我想在服务器端脚本 (Bash) 中确定该文件是否仍在使用中。

正如手册页所述,fuserlsof -N都应允许检测 NFS 共享上正在使用的文件。但是,我没有“看到”服务器上正在使用的文件,这导致稍后处理时文件损坏。

设置:

我的 NFS/etc/exports包含这些设置(UID 和 GID 是服务器上共享目录的所有者,为了更好地显示而换行):

/export/foo 10.3.2.0/255.255.255.0 
    (rw,sync,no_subtree_check,all_squash,anonuid=1001,anongid=1001)

客户端使用以下命令挂载此共享:

10.3.2.197:/export/foo  /data002/  nfs  defaults        0 0

服务器是使用“nfs-kernel-server 1:1.2.0-4ubuntu4”的 Ubuntu 10.04,客户端是 SLES 10 SP2

当我在客户端(共享目录内)打开文件时,使用

echo "Hello" > test.txt && tail -f foo.txt

然后检查(仍在客户端)该文件是否正在使用

fuser foo.txt

我可以看到该文件正在使用中。但是,在服务器端(fuser foo.txtlsof -N | grep foo.txt)检查时,我没有得到任何使用信息。

如何在服务器上检查 NFS 共享上的文件是否正在使用中(无论是本地还是远程)?或者我当前的设置有什么问题?

答案1

lsof 只会显示您的本地系统正在使用哪些资源,在任何情况下它都不会显示任何外部资源获取,但有一种方法可以解决这个问题......

所有远程使用情况都将由 NFS 服务器上的 lockd 守护进程跟踪,如果您尝试在由另一个节点写入时访问该文件,它将对文件发出锁定,因此如果您使用它(您的挂载选项有点指向那边)您可以在这种情况下使用 lsof 来显示文件是否被锁定。

相关内容