关于锁定文件的问题

关于锁定文件的问题

我有一个文件,某个程序锁定了它,之后该程序退出了。现在没有程序可以锁定此文件。此文件位于服务器 A 上的 NFS 共享上,我正在从服务器 B 锁定它。我在服务器 A 上使用 fuser 和 lsof 实用程序来检查哪个进程持有锁,但在这两种情况下输出都是空的。锁定是使用 perl 脚本完成的,如以下代码示例所示:

我的 $lockmask = pack('ssll s', &F_WRLCK, 0, 0, 0, 0); fcntl(LOCKFILE, &F_SETLK, $lockmask)

我该如何处理这个问题?

答案1

重新启动 nfslock 服务。

答案2

nfslock 服务正在您的本地主机上运行,​​而不是在服务器上。当它重新启动时,它会通知中央锁守护进程:“嘿!我是新来的。我目前没有锁。”然后,中央锁守护进程将检查其获取的锁的清单,注意到您的本地主机用过的拥有一些,但是由于它刚刚听说它没有任何锁,它将被允许释放锁,因为它们现在已经过时了。

可能有一个专门用于 nfslock 的启动脚本。例如,在 RedHat 下,您可能能够调用service nfslock restart。在其他操作系统或 OS 版本下,它可能是一个调用的脚本 /etc/rc.d/nfslock,您必须运行它两次 - 一次使用stop参数,一次使用start参数。重新启动锁管理器后,检查它是否正确启动rpcinfo -p,并在服务列中查找至少一行nlockmgr。重要 NFS 命令的快速列表位于linuxconfig.org

如果这是生产系统,您应该通知您的用户。如果这是生产系统,您还应该停止在主机上进行开发,以免重复这种情况并导致中断。

顺便说一句,在 Perl 中,有一种更易读的方法可以通过 NFS 获取锁。文件::NFSLock清晰、简洁,并且可能比您的代码经过更好的测试。无意冒犯。当您不得不返回此代码时,它将对您自己和其他人更有意义。此外,您应该假设锁定目前可能不适用于您的共享文件系统。在这种情况下,您应该妥善处理故障,然后正确记录故障。不是假设锁定正在起作用。

相关内容