Perl的多服务器环境中使用FCNTL

问题描述:

我试图用FCNTL库在同一时间只能运行一个脚本实例,Perl的多服务器环境中使用FCNTL

它的工作原理,当它是谁运行脚本(同一台服务器只能在一台服务器” t运行脚本的另一个实例),但如果我有另一个服务器(实际上访问相同的文件系统)运行脚本,它不起作用(他可以实际运行它)。

任何人对如何处理这个使用FCNTL库的想法(或其他?)提前

感谢。

+0

你如何使用Fcntl来运行脚本的一个实例? – choroba

+0

https://blog.booking.com/highlander-daemons-without-daemons.html – choroba

+0

您能举一个可重现的例子吗? “相同的文件系统”是否意味着NFS被挂载?你有没有检查你的NFS锁经理工作正常?有很多原因可能导致远程文件锁不能被使用。尤其是因为 - 他们是自由裁量的,而不是强制性的。 – Sobrique

文件锁定在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