简而言之:使用flock() 编写了一个Perl 脚本。在 Linux 上,它的行为符合预期。在 AIX 上,flock() 始终返回 1,即使脚本的另一个实例使用 flock() 应该持有锁定文件的排他锁。
我们发布了一个 Bash 脚本来重新启动我们的程序,依靠 flock(1) 来防止同时重新启动产生多个进程。最近我们部署在 AIX 上,默认情况下,flock(1) 不会出现,管理员也不会提供。为了简单起见,我写了一个 Perl 脚本,叫做flock,像这样:
#!/usr/bin/perl
use Fcntl ':flock';
use Getopt::Std 'getopts';
getopts("nu:x:");
%switches = (LOCK_EX => $opt_x, LOCK_UN => $opt_u, LOCK_NB => $opt_n);
my $lockFlags = 0;
foreach $key (keys %switches) {
if($switches{$key}) {$lockFlags |= eval($key)};
}
$fileDesc = $opt_x || $opt_u;
open(my $lockFile, ">&=$fileDesc") || die "Can't open file descriptor: $!";
flock($lockFile, $lockFlags) || die "Can't change lock - $!\n";;
我通过从两个终端选项卡几乎同时运行两次 (flock -n -x 200; sleep 60)200>lockfile 来测试脚本。
在 Linux 上,如预期的那样,第二次运行因“资源暂时不可用”而终止。
在 AIX 上,第二次运行获得锁,flock() 返回 1,这绝对不是预期的。
我了解flock() 在两个系统上的实现方式不同,Linux 版本使用flock(1),而AIX 版本使用fcntl(1)。我没有足够的专业知识来了解这如何导致我的问题以及如何解决它。
非常感谢您的任何建议。