В двух словах: написал Perl-скрипт, используя flock(). В 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). У меня недостаточно опыта, чтобы понять, как это вызывает мою проблему и как ее решить.
Большое спасибо за любой совет.