Вы используете лексический дескриптор файла, ограниченный внутри сабвуфера. Когда check_instances
возвращается, файловый дескриптор автоматически закрывается, что снимает блокировку. Таким образом, вы никогда не увидите конфликта, если две копии не будут проверены одновременно.
Убедитесь, что файловый дескриптор остается открытым до тех пор, пока выполняется скрипт (или до тех пор, пока вы хотите сохранить блокировку). Например:
{
my $fh;
sub check_instances {
return if $fh; # We already checked
open $fh, '<', $0 or die $!;
unless (flock($fh, LOCK_EX|LOCK_NB)) {
print "$0 is already running. Exiting.\n";
exit 1;
}
}
} # end scope of $fh
Это также было бы хорошим местом для использования state
переменной , если вам может потребоваться Perl 5.10.