场景:
我们使用NFS共享来允许客户端上传原始video素材。 然后从(NFS)服务器上的目录轮询文件以进行处理。 由于我们不想处理尚未完成上传的文件,因此我想在服务器端脚本(Bash)中确定文件是否仍在使用中。
如手册页所述, fuser和lsof -N应允许检测NFS共享中正在使用的文件。 但是,我不会“看到”在服务器上使用的文件,这会在处理中稍后导致损坏的文件。
build立:
我的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服务器上的文件是否正在使用(无论是本地还是远程)? 或者我在当前的设置中做错了什么?
lsof只会显示你的本地系统正在使用哪些资源,绝不会显示任何外部资源获取,但是有一个办法可以解决这个问题。
所有的远程使用情况都会被NFS服务器上的lockd守护进程跟踪,如果你在另一个节点写入的时候尝试访问它,它会发出一个锁,所以如果你使用这个(你的挂载选项有点这样)你可以在这种情况下使用lsof来显示文件是否被locking。