2

我正在使用 PSEXECsystem($CMD)在 perl 中运行远程进程。

我有一台运行 system 的计算机(我们称之为-#1)cmd和另一台计算机(我们称之为-#2),它“接收”来自计算机#1 的命令。

有时,第二台计算机 (#2) 中的进程会卡住。

如何cmd在计算机 #1 中为系统设置超时,以在几分钟后强制终止 cmd?


感谢您的回答,但是:我想做一些非常简单的事情,我有 2 个 perl 文件。file#1 计算秒数 1 到 10。(+打印到屏幕) file#2-超时文件,该文件 cal file#1(系统命令)应该在 5 秒后终止文件 #1。

结果...:发生超时,但进程 #1 仍在运行...

文件#2

$timeout=5;
eval {
    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
    alarm $timeout;
    $nread = system('F:\perl1.pl');
    alarm 0;
};
if ($@) {
    die unless $@ eq "alarm\n";   # propagate unexpected errors
    print "process terminated\n";}
else {
    # didn't
}

文件#1

$i=0;
while($

    i<10){
    sleep(1);
    $i++;

print "$i\n";
}

CMD 窗口结果:

C:\>F:\perl2.pl
1
2
3
4
process terminated

C:\>5
6
7
8
9
10
4

2 回答 2

4

IPC::Run为您处理。

use IPC::Run qw( run timeout );

run \@cmd, timeout( 120 )
   or die "cat: $?";
于 2013-06-04T16:40:51.033 回答
2

您可以alarm在您的情况下使用:

如果您想使用alarm超时system通话,您需要使用 eval/die对。您不能依赖set toalarm导致系统调用失败,因为 Perl 设置了信号处理程序来重新启动某些系统上的调用。使用/总是有效的,.$!EINTRsystemevaldieperlipc

eval {
    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
    alarm $timeout;
    $nread = sysread SOCKET, $buffer, $size;
    alarm 0;
};
if ($@) {
    die unless $@ eq "alarm\n";   # propagate unexpected errors
    # timed out
}
else {
    # didn't
}
于 2013-06-04T12:57:32.380 回答