无法获取Perl';他在工作

无法获取Perl';他在工作,perl,file,locking,Perl,File,Locking,我似乎不能做Perl的 工作 我正在锁定一个文件,检查返回值以确保它确实被锁定,并且我仍然能够打开并写入它,就像什么都没发生一样 下面是我如何锁定文件的 #!/usr/bin/perl -w use strict; use Fcntl ':flock'; $| = 1; my $f = $ARGV[0]; open( my $fh, '>>', $f ) or die "Could not open '$f' - $!"; print "locking '$f'...";

我似乎不能做Perl的 工作 我正在锁定一个文件,检查返回值以确保它确实被锁定,并且我仍然能够打开并写入它,就像什么都没发生一样

下面是我如何锁定文件的

#!/usr/bin/perl -w

use strict;

use Fcntl ':flock';

$| = 1;

my $f = $ARGV[0];

open( my $fh, '>>', $f ) or die "Could not open '$f' - $!";
print "locking '$f'...";
flock($fh, LOCK_EX) or die "Could not lock '$f' - $!";
print "locked\n";

sleep 10;
print "waking up and unlocking\n";
close( $fh );
当脚本处于休眠状态时,我可以从不同的进程中处理相同的文本文件

#!/usr/bin/perl -w

use strict;

my $f = $ARGV[0];

open( my $fh, '>>', $f ) or die "Could not open '$f' - $!";
print $fh "This line was appended to a locked file!\n";
close( $fh );

为什么我可以打开文件并写入它而不被告知它已锁定?

我不认为
flock
会像你认为的那样。锁定文件不会阻止任何人对文件执行任何操作,除非试图获得对同一文件的锁定

从我的系统上的
man 2 flock

flock(2)仅放置建议锁;给定对文件的适当权限,进程可以自由忽略flock(2)的使用并对文件执行I/O

flock()
是一个建议锁。您必须使用
flock()

还要意识到,调用
flock()
的方式会一直阻塞,直到它获得锁为止。如果您希望出现故障,还必须使用
LOCK\u NB
标志

open(my $lf, ">>fileIWantToLockOn");
my $gotLock = flock($lf, LOCK_EX | LOCK_NB);

unless ($gotLock)
{
    print "Couldn't get lock. Exiting";
    exit 0;
}

编辑:还要注意,
flock()
在NFS上不起作用

flock
与建议锁一起工作。除此之外,这意味着只有尝试聚集同一文件的其他进程才会意识到该文件已锁定。

哇。。。如果不在NFS上工作,这将是一个严重的问题。。。我希望有一个进程创建并锁定一个文件。然后,我将稍后检查该文件的锁定状态,以查看进程是否已完成。也许还有另一种方法可以做到这一点?问题是,即使它确实起作用,并且文件不再被锁定,您也不知道等待的进程是否成功完成—您只知道它不再被锁定。对于一些不太好用的东西,为什么不让长时间运行的进程在完成后在文件系统上创建一个文件呢?@brian:我真的不在乎它是如何完成的,只要它完成了就行。我正在写一个包装实用程序,用来包装我无法控制的东西。。。我计划创建锁定的文件并执行新流程。我可能能够在文件创建结束时结束长时间运行的进程,但是我会被困在不知道它是否仍在运行,或者它是否崩溃…这两个进程必须在两台不同的机器上,嗯?与SGE在一个集群中运行。。。他们可能在任何地方。