Perl 如何隐藏或锁定文件直到任务完全执行
我有一个Perl脚本,它将运行一段时间。 它创建了一个文件并将一些数据写入其中。 我还有另一个Cron工作,每天下午5点 当我的第一个脚本在下午5点运行时,我的问题来了。 即使在运行时(意味着该文件没有所有详细信息),它也会从指定的路径中拾取文件 如何预防 我不能在我的脚本中使用flock。Perl 如何隐藏或锁定文件直到任务完全执行,perl,unix,cron,Perl,Unix,Cron,我有一个Perl脚本,它将运行一段时间。 它创建了一个文件并将一些数据写入其中。 我还有另一个Cron工作,每天下午5点 当我的第一个脚本在下午5点运行时,我的问题来了。 即使在运行时(意味着该文件没有所有详细信息),它也会从指定的路径中拾取文件 如何预防 我不能在我的脚本中使用flock。 我需要另一种方法来实现这一点。我建议看一看——它可以让你在文件上设置一个建议锁。但是,如果脚本和cron作业都请求锁,那么其中一个将阻止另一个,直到释放锁(当文件关闭时) 有几种方法可以做到这一点 让写入文
我需要另一种方法来实现这一点。我建议看一看——它可以让你在文件上设置一个建议锁。但是,如果脚本和cron作业都请求锁,那么其中一个将阻止另一个,直到释放锁(当文件关闭时) 有几种方法可以做到这一点
一种方法是非cron脚本在第一次启动时删除生产文件,写入临时文件,然后在完成工作后将临时文件复制到prod文件位置。在示例代码中,默认情况下,脚本完成时会删除临时文件 然后,在试图在下午5点读取文件的脚本中,让它循环并休眠,直到prod文件存在: 写入文件的脚本:
use strict;
use warnings;
use File::Copy;
use File::Temp qw(tempfile);
my $prod_file = 'prod_dir/prod.txt';
unlink $prod_file or die $! if -e $prod_file;
my $tfh = File::Temp->new(UNLINK => 1);
while (...){
...;
print $tfh "whatever\n";
}
copy $tfh->filename, $prod_file or die $!;
在1700小时读取文件的脚本:
use strict;
use warnings;
my $file = 'prod_dir/prod.txt';
while (! -e $file){
sleep 10;
}
open my $fh, '<', $file or die $!;
while (<$fh>){
...; # do stuff
}
使用严格;
使用警告;
my$file='prod_dir/prod.txt';
while(!-e$文件){
睡眠10;
}
打开我的$fh,'这可能会有一个答案-不久前的类似问题。我不能使用flock。我需要另一种方法来实现这一点。为什么你说你不能使用flock()
?如果你不能使用flock(无论出于何种原因),你可以在CPAN的众多PID包中使用,例如File::PID。看看@Re“我不能在脚本中使用flock”,为什么不呢?它完全符合你的要求。如果您不告诉我们您的需求是什么,您希望我们如何满足这些需求?1.即使我使用不同的名称编写,也会使用该文件(Cron脚本将使用特定文件夹中的任何文件)3.我不能在此处使用锁定文件功能。除了flock()有没有其他方法可以实现这一点?您专门询问如何锁定文件flock
就是这样做的。选择。。。嗯,有很多,但“这取决于”。@Azarudeen:“除了flock(),还有其他方法可以实现这一点吗?”我在一篇文章中写了三个备选方案。如果您解释为什么不能使用flock()
,我们可能会提供更多帮助。我尝试使用lock。但即使使用flock,我也可以将该文件移动到其他位置。这是羊群的例外行为吗是的。所有unix锁定语义(包括)都是建议性的。这两个进程都需要检查锁。