循环时文件句柄内的Perl超时

时间:2013-12-17 16:34:40

标签: perl while-loop timeout fork file-handling

我正在寻找一种在while循环中引入超时的方法,该循环正在动态搜索活动日志。

我担心这可能无法实现,因为我的下面尝试总是会超时,因为我正在转移正在进行的文件句柄日志搜索,因此找不到或遗漏了日志字符串。

如果没有太多编辑,有没有办法解决这个问题,我说这是因为下面的代码片段意味着在fork分支中运行(因为我有一个类似的会话同时运行)。

这是我糟糕的尝试......

my $countD       = 0;
my $Dtimeout     = 120;
my $DNOTComplete = 0;

while (<$log_DUT>) {
    $fh_DUT->print($_);
    last if m/standby handle h/;
    $countD++;
    sleep(1);
    if ( $countD > $Dtimeout ) { 
        $DNOTComplete = 1;
        last;
    }   
}

2 个答案:

答案 0 :(得分:2)

这是你在寻找什么?

my $countD = 0;
my $Dtimeout = 120;
my $DNOTComplete = 0;

eval {
    local $SIG{ALRM} = sub { die "Timeout" }; # alarm handler
    alarm($Dtimeout); # start alarm
                      # kernel will send us SIGALRM
                      # after $Dtimeout
    while(<$log_DUT>) {
        $fh_DUT->print($_);
        last if m/standby handle h/;
        $countD++;
    }

    alarm(0); # cancel alarm
};
if ($@ =~ /^Timeout/) {
    # it was timeout
    # handler called
    # and died inside eval
    $DNOTComplete = 1;
}

答案 1 :(得分:1)

您正在寻找alarm

实施例

#!/usr/bin/perl

use strict; 
use warnings;

local $SIG{ALRM} = sub { die "alarm!\n" };

alarm(5);

while (1) {
   print scalar localtime, "\n"; 
   sleep 1;
}
alarm(0);

输出:

$ perl test.pl
Tue Dec 17 08:53:57 2013
Tue Dec 17 08:53:58 2013
Tue Dec 17 08:53:59 2013
Tue Dec 17 08:54:00 2013
Tue Dec 17 08:54:01 2013
alarm!