如何完全执行任务之前隐藏或锁定文件

时间:2016-10-18 12:51:46

标签: perl unix cron

我有Perl脚本会运行一段时间。 它创建了文件并将一些数据写入其中。 我还有另一个Cron工作,每天下午5点发生。

当我的第一个脚本在下午5点运行时出现问题。 即使它正在运行(意味着文件没有所有细节),它也会从指定的路径中选择文件。

如何防止这种情况?

我无法在我的剧本中使用flock。 我需要另一种方法来做到这一点。

3 个答案:

答案 0 :(得分:3)

我建议您查看flock - 它可以让您在文件上设置顾问锁定。但是如果您的脚本和cron作业都请求锁定,那么将阻止另一个,直到锁定被释放(文件关闭时)。

答案 1 :(得分:2)

有几种方法可以做到这一点。

  1. 让写入文件的进程将其写为不同的名称,只有在数据全部写完后才将其重命名为预期的名称。
  2. 写入所有数据后,写入文件的进程会写入另一个标记文件。让您的读取文件的进程在读取数据文件之前检查是否存在标记文件。
  3. 使用标准的Unix文件锁定功能。 Perl具有实现此功能的xaxxon’s answer功能。

答案 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
}