2012-12-02 31 views
0

我有一个perl脚本,它运行下标以收集5行信息。目前,它正在做这样的:从下标捕获输出,超时

my @info = split(/\n/,`/script/directory/$devtype.pl $ip $port`); 

但是,对于我的控制范围之外的种种原因,标有时挂了,在这种情况下我想只停留标,继续前进。什么将是

  • 最好的办法获取PID的下标
  • 等待那些5行输出,并杀死-9 PID如果设定的超时
之前没有收到输出

我在考虑use ing Forks::Super,与下标共享@info,并有一个等待数组填满的循环,直到超时。然而,我不确定如何在不重写下标的情况下实现这一点,我不想因为与其他脚本的向后兼容而不想这样做。

+0

HM,也许线程?如果我明白你想要什么,你可以在单独的线程上工作,并从你的脚标线程中获取信息 – gaussblurinc

+0

@loldop你能不能更具体些?这与我一直在想的一致,但我还没有找到一种方法来做到不涉及修改下标。 – Jarmund

回答

2

下面的代码使用IPC::Run具有30秒的超时抓取5行至@info并确保子进程是死:

#!/usr/bin/env perl 
use strict; 
use warnings qw(all); 

use IPC::Run qw(start timeout new_chunker input_avail); 

my @info; 
my $h; 

# trap timeout exception 
eval { 
    $h = start 
     # beware of injection here! 
     # also, $^X holds the name of your actual Perl interpreter 
     [$^X, "/script/directory/$devtype.pl", $ip, $port], 

     # read STDOUT line-by line 
     '>', new_chunker, 

     # handle each line 
     sub { 
      my ($in, $out) = @_; 
      if (input_avail) { 
       if (5 > @info) { 
        chomp $in; 
        push @info, $in; 
        return 1; 
       } else { 
        return 0; 
       } 
      } 
     }, 
     timeout(30); 

    # is it dead yet? 
    $h->finish; 
}; 

# make sure it is dead 
if ([email protected]) { 
    warn "exception: [email protected]"; 
    $h->kill_kill; 
} 
+0

工程就像一个魅力,欢呼!记录:这是一个由我的crontab运行的脚本,所以不用担心注入。 – Jarmund