捕获下标中的输出,超时

时间:2012-12-02 10:02:26

标签: multithreading perl stdout

我有一个运行下标的perl脚本来收集5行信息。目前正在这样做:

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

然而,由于我控制之外的各种原因,下标有时会挂起,在这种情况下我想停止下标并继续前进。

的最佳方法是什么?
  • 获取下标的PID
  • 等待那5行输出,如果在设置超时之前没有收到输出,则杀死-9 pid

我在考虑use使用Forks::Super,与下标共享@info,并且有一个等待数组填充的循环,直到超时。但是,我不知道如何在不重写下标的情况下实现这一点,因为与其他脚本的向后兼容性,我不愿意这样做。

1 个答案:

答案 0 :(得分:2)

以下代码使用IPC::Run获取5行到@info,超时时间为30秒,并确保子进程已死:

#!/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 ($@) {
    warn "exception: $@";
    $h->kill_kill;
}