Perl在多服务器上下文中使用Fcntl

时间:2017-10-13 11:12:38

标签: perl fcntl

我正在尝试使用Fcntl库一次只运行一个脚本实例,

只有一个服务器运行脚本(同一个服务器无法运行另一个脚本实例),但是如果我有另一个服务器(实际访问同一个文件系统)运行脚本,它不起作用(他可以执行它)。

任何人都知道如何使用Fcntl库(或其他?)

来处理这个问题

提前致谢。

1 个答案:

答案 0 :(得分:0)

文件锁定在NFS上是非常困难的,但它可能对你所需要的东西有点过分。只需让服务器实例在一个可通过网络访问的文件上进行协调,该文件将包含有关" lock"的服务器信息。

...
if (-f "/network/accessible/file.lock") {
    open my $fh, '<', "/network/accessible/file.lock";
    my $lockholder = <$fh>;
    die "Server lock held by $lockholder";

    # ... you could also examine $lockholder and verify that
    #     the other server is still alive ...
} else {
    open my $fh, '>', "/network/accessible/file.lock";
    print $fh $ENV{HOSTNAME},":$$";
    close $fh;
}
...

# need to remove the lock when the current server finishes
END { unlink "/network/accessible/file.lock" }

除非您在几毫秒之内启动两台服务器,否则这就足够了。如果你对此有偏执,你可以让服务器在创建后读取锁文件,和/或在整个程序中定期读取锁文件,以确保锁文件信息没有改变。

} else {
    open my $fh, '>', "/network/accessible/file.lock";
    print $fh $ENV{HOSTNAME},":$$";
    close $fh;

    sleep 1;
    open $fh, '<', "/network/accessible/file.lock";
    my $lockholder = <$fh>;
    if ($lockholder ne "$ENV{HOSTNAME}:$$") {
        die "Server lock was stolen by $lockholder!";
    }
}