Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何隐藏或锁定文件直到任务完全执行_Perl_Unix_Cron - Fatal编程技术网

Perl 如何隐藏或锁定文件直到任务完全执行

Perl 如何隐藏或锁定文件直到任务完全执行,perl,unix,cron,Perl,Unix,Cron,我有一个Perl脚本,它将运行一段时间。 它创建了一个文件并将一些数据写入其中。 我还有另一个Cron工作,每天下午5点 当我的第一个脚本在下午5点运行时,我的问题来了。 即使在运行时(意味着该文件没有所有详细信息),它也会从指定的路径中拾取文件 如何预防 我不能在我的脚本中使用flock。 我需要另一种方法来实现这一点。我建议看一看——它可以让你在文件上设置一个建议锁。但是,如果脚本和cron作业都请求锁,那么其中一个将阻止另一个,直到释放锁(当文件关闭时) 有几种方法可以做到这一点 让写入文

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

当我的第一个脚本在下午5点运行时,我的问题来了。 即使在运行时(意味着该文件没有所有详细信息),它也会从指定的路径中拾取文件

如何预防

我不能在我的脚本中使用flock。
我需要另一种方法来实现这一点。

我建议看一看——它可以让你在文件上设置一个建议锁。但是,如果脚本和cron作业都请求锁,那么其中一个将阻止另一个,直到释放锁(当文件关闭时)

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

  • 让写入文件的进程以不同的名称写入文件,并且仅在数据全部写入后将其重命名为预期名称
  • 让写入文件的进程在写入所有数据后再写入另一个标记文件。让读取文件的进程在读取数据文件之前检查标记文件是否存在
  • 使用标准的Unix文件锁定功能。Perl具有实现此功能的函数

  • 一种方法是非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锁定语义(包括)都是建议性的。这两个进程都需要检查锁。