我有一个程序被locking的文件,然后程序退出。 现在没有程序可以locking这个文件。 这个文件位于服务器A上的NFS共享上,并且我从服务器B上locking了它。我在服务器A上使用了fuser和lsof实用程序来检查哪个进程持有锁,但是在这两种情况下输出都是空的。 锁使用perl脚本来完成,就像这个代码示例一样:
my $ lockmask = pack('ssll s',&F_WRLCK,0,0,0,0); fcntl(LOCKFILE,&F_SETLK,$ lockmask)
我该如何处理这个问题?
重新启动nfslock服务。
nfslock服务在本地主机上运行,而不是在服务器上运行。 当它重新启动时,它会通知中央锁守护进程:“嘿,我在这里是新的,我现在没有锁。 然后中央锁守护进程将检查其获取的锁的清单,注意你的本地主机曾经有一些,但是因为它刚刚听说它没有任何锁,所以它将被允许释放锁,因为它们现在是陈旧的。
有可能是一个特别针对nfslock的启动脚本。 例如,在RedHat下,您可以调用service nfslock restart 。 在其他操作系统或操作系统的风格下,它可能是一个名为/etc/rc.d/nfslock的脚本,您将不得不运行两次 – 一次使用stop参数,一次使用start参数。 重新启动锁pipe理器后,检查rpcinfo -p是否正确启动,并在服务列中查找至less一行nlockmgr 。 重要的NFS命令列表在linuxconfig.org上 。
如果这是一个生产系统,你应该通知你的用户。 如果主机是生产系统,您也应该停止在主机上进行开发,以免重复这种情况并导致停机。
顺便说一句,有一个更可读的方式来locking在Perl Perl的NFS。 File :: NFSLock清晰,简洁,可能比你的代码更好的testing。 没有冒犯的意思。 当你不得不回到这个代码时,对你自己和其他人来说会更有意义。 另外,您应该假设目前locking可能不在您的共享文件系统上。 在这种情况下,您应该优雅地处理故障,然后正确logging故障。 不要认为locking正在工作。