Perl的多服务器环境中使用FCNTL
问题描述:
我试图用FCNTL库在同一时间只能运行一个脚本实例,Perl的多服务器环境中使用FCNTL
它的工作原理,当它是谁运行脚本(同一台服务器只能在一台服务器” t运行脚本的另一个实例),但如果我有另一个服务器(实际上访问相同的文件系统)运行脚本,它不起作用(他可以实际运行它)。
任何人对如何处理这个使用FCNTL库的想法(或其他?)提前
感谢。
答
文件锁定在NFS上非常困难,但它可能是你需要的矫枉过正。只需让服务器实例在网络可访问的文件上进行协调,该文件将包含有关“服务器”的信息。
...
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!";
}
}
+0
感谢这工作:) – gatemed
你如何使用Fcntl来运行脚本的一个实例? – choroba
https://blog.booking.com/highlander-daemons-without-daemons.html – choroba
您能举一个可重现的例子吗? “相同的文件系统”是否意味着NFS被挂载?你有没有检查你的NFS锁经理工作正常?有很多原因可能导致远程文件锁不能被使用。尤其是因为 - 他们是自由裁量的,而不是强制性的。 – Sobrique