我有Perl脚本会运行一段时间。 它创建了文件并将一些数据写入其中。 我还有另一个Cron工作,每天下午5点发生。
当我的第一个脚本在下午5点运行时出现问题。 即使它正在运行(意味着文件没有所有细节),它也会从指定的路径中选择文件。
如何防止这种情况?
我无法在我的剧本中使用flock。 我需要另一种方法来做到这一点。
答案 0 :(得分:3)
我建议您查看flock
- 它可以让您在文件上设置顾问锁定。但是如果您的脚本和cron作业都请求锁定,那么将阻止另一个,直到锁定被释放(文件关闭时)。
答案 1 :(得分:2)
有几种方法可以做到这一点。
答案 2 :(得分:0)
执行此操作的一种方法是非cron脚本在首次启动时删除生产文件,写入临时文件,然后当它完成工作时,将临时文件复制到产品文件位置。在示例代码中,默认情况下将在脚本完成时删除临时文件。
然后,在尝试在下午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
}