![如何找出哪个客户端在 NFS 上拥有文件锁定](https://linux22.com/image/1564740/%E5%A6%82%E4%BD%95%E6%89%BE%E5%87%BA%E5%93%AA%E4%B8%AA%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%9C%A8%20NFS%20%E4%B8%8A%E6%8B%A5%E6%9C%89%E6%96%87%E4%BB%B6%E9%94%81%E5%AE%9A.png)
我们有一个由 NFS4 支持的 Centos 7 集群。其中有一些文件运行带有 LOCK_EX 的 flock 块(并且使用 LOCK_NB 返回资源暂时不可用)。只有少数几个文件,而且它们都是用户有理由使用 flock() 的文件。
因此,某些东西锁定了这些文件。但是谁呢?我们尝试在集群中的每台机器上运行 lsof,但没有任何结果,但可能有一些我们不知道的客户端。lslocks 程序没有帮助。
我如何才能找出哪台机器(更不用说哪个进程)拥有锁?
或者 NFS 是否可能感到困惑,认为存在锁,即使进程早已消失?在这种情况下,我如何才能找出情况是否如此以及如何清除它?重新启动 NFS 服务器需要更改请求,因此并非易事。
逐个重新启动所有客户端的策略也是如此。
尽管许多网页都指出 flock() 无法跨 NFS 运行,但其他网页却表示可以(例如 https://serverfault.com/questions/66919/file-locks-on-an-nfs),我的测试也证实了这一点。例如,运行:
perl -E '打开 $fh,“>>”,shift 或 die“打开:$!”;说“完成打开”;flock($fh,2) 或 die“flock:$!”;说“完成 flock”;sleep 10' somefilename
在一个客户端上运行它,等待 5 秒钟,在另一个客户端上运行它,第二个客户端不会打印“Done flock”,直到第一个客户端在 5 秒钟后退出。正如您所期望的那样。因此 NFS 服务器知道该文件已被锁定。我如何让它告诉我它认为是谁锁定了它?