0

添え字を実行して 5 行の情報を収集する perl スクリプトがあります。現在、次のように行われています。

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

ただし、私の制御外のさまざまな理由で、添え字がハングすることがあります。そのような場合は、添え字を停止して先に進みたいと思います。最善のアプローチは何でしょうか

  • 添字の PID を取得する
  • これらの 5 行の出力を待ち、設定されたタイムアウト前に出力が受信されない場合は pid を kill -9 します

私はuseingを考えていて、添え字Forks::Superと共有@infoし、タイムアウトまで配列がいっぱいになるのを待つループを持っています。ただし、添え字を書き換えずにこれを実現する方法がわかりません。他のスクリプトとの下位互換性があるため、これは避けたいと思います。

4

1 に答える 1

2

次のコードは、IPC::Run@infoを使用して 5 行を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;
}
于 2012-12-02T19:52:19.817 に答える