Perl File::NFSLock 获取锁失败,错误为 EACCESS

Perl File::NFSLock fails to acquire lock with error EACCESS

我在 NFS 装载上有一个文件,对它进行的每个操作都会锁定和解锁。 最初我使用 flock(filehandle, LOCK_EX|LOCK_NB) 但尝试失败 I/O Error.
在浏览多个论坛时,我找到了一个解决方案,可以在 NFS 共享上使用 File::NFSLock 到 lock/unlock 文件。然而,NFSLock 在第一次尝试锁定和解锁文件时成功,但是当 2 个进程同时尝试访问锁时,它失败并显示 EACESS 错误。
代码如下:

  1. Process 1 使用以下代码获取锁并在完成后释放锁:
    if ($lock = new File::NFSLock {
      file      => $handle,
      lock_type => LOCK_EX|LOCK_NB,
    }) {
  1. 现在使用 fork 命令生成了 2 个进程(Process 2Process 3)。当 Process 2 尝试使用上述步骤 1 中的相同代码锁定同一文件时,文件锁定失败并出现错误 Permission Denied。 15 秒后 Process 3 尝试获取锁也失败并出现 Permission Denied 错误。
    当我在文件上执行 fuser -v 时,我可以看到打开文件进行写入的 2 个进程 ID(Process 2Process 3)。

互联网上很少有文档表明 The lock cannot be set because it is blocked by an existing lock on the file. Some systems use EAGAIN in this case, and other systems use EACCES 但是在我的情况下似乎并非如此,因为 Process 1 已经释放了锁。
另请注意,所有 3 个进程都是从同一个脚本生成的,因此不应该存在不同用户尝试获取锁的问题。

谢谢!

File::NFSLock 需要一个文件路径——而不是文件句柄——作为它的 file 参数。用文件路径替换文件句柄解决了这个问题。

if ($lock = new File::NFSLock {
  file      => $path,             # Previously, I used file handle here.
  lock_type => LOCK_EX|LOCK_NB,
}) {