2013-06-04 30 views
2

使用系統CMD我使用PSEXEC與在Perl system($CMD)運行遠程進程時。超時在Perl

我有一臺運行系統cmd的計算機(讓我們稱它爲#1)和另一臺計算機(讓它稱爲#2),它從計算機#1接收命令。

有時在第二計算機的處理(#2)被卡住。

我如何設置超時在計算機#1系統cmd幾分鐘後,將強制終止CMD?


感謝您的答案,但: 即時特林做財產以後很簡單,我有2個perl的文件。 計數秒1到10的文件#1(+打印到屏幕) 文件#2-超時文件,應該在5秒後終止文件#1的cal文件#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 ([email protected]) { 
    die unless [email protected] 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 
+2

['的perldoc -q timeout'](http://perldoc.perl.org/perlfaq8.html#How-do-I-timeout-a-slow-event%3f) – daxim

回答

2

你可以在你的情況下使用alarm

如果你想使用alarm超時一個system叫你需要使用 eval/die對。您不能依靠alarm導致系統調用 失敗,$!設置爲EINTR,因爲Perl在某些系統上將信號處理程序設置爲 重新啓動system調用。使用eval/die始終有效, 模以Signals in perlipc給出的注意事項爲模。

eval { 
    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required 
    alarm $timeout; 
    $nread = sysread SOCKET, $buffer, $size; 
    alarm 0; 
}; 
if ([email protected]) { 
    die unless [email protected] eq "alarm\n"; # propagate unexpected errors 
    # timed out 
} 
else { 
    # didn't 
} 
+0

下面是一個例子,其中[''eval/die'不起作用](http://stackoverflow.com/q/8452445/455789)。 –

4

IPC::Run句柄爲您服務。

use IPC::Run qw(run timeout); 

run \@cmd, timeout(120) 
    or die "cat: $?";