我正在尝试使用Fcntl库一次只运行一个脚本实例,
只有一个服务器运行脚本(同一个服务器无法运行另一个脚本实例),但是如果我有另一个服务器(实际访问同一个文件系统)运行脚本,它不起作用(他可以执行它)。
任何人都知道如何使用Fcntl库(或其他?)
来处理这个问题提前致谢。
答案 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!";
}
}