我有一个运行下标的perl脚本来收集5行信息。目前正在这样做:
my @info = split(/\n/,`/script/directory/$devtype.pl $ip $port`);
然而,由于我控制之外的各种原因,下标有时会挂起,在这种情况下我想停止下标并继续前进。
的最佳方法是什么?我在考虑use
使用Forks::Super
,与下标共享@info
,并且有一个等待数组填充的循环,直到超时。但是,我不知道如何在不重写下标的情况下实现这一点,因为与其他脚本的向后兼容性,我不愿意这样做。
答案 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;
}