设想:
我们使用 NFS 共享来允许客户端上传原始视频材料。然后从 (NFS) 服务器上的目录中轮询文件以进行处理。由于我们不想处理尚未完成上传的文件,因此我想在服务器端脚本 (Bash) 中确定该文件是否仍在使用中。
正如手册页所述,fuser
和lsof -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.txt
和lsof -N | grep foo.txt
)检查时,我没有得到任何使用信息。
如何在服务器上检查 NFS 共享上的文件是否正在使用中(无论是本地还是远程)?或者我当前的设置有什么问题?
答案1
lsof 只会显示您的本地系统正在使用哪些资源,在任何情况下它都不会显示任何外部资源获取,但有一种方法可以解决这个问题......
所有远程使用情况都将由 NFS 服务器上的 lockd 守护进程跟踪,如果您尝试在由另一个节点写入时访问该文件,它将对文件发出锁定,因此如果您使用它(您的挂载选项有点指向那边)您可以在这种情况下使用 lsof 来显示文件是否被锁定。