2010-10-19 49 views
24

有時我的系統調用進入一個永無止境的狀態。爲了避免我希望能夠在指定的時間後突破呼叫。如何爲Perl系統調用指定超時限制?

有沒有辦法指定system的超時限制?

system("command", "arg1", "arg2", "arg3"); 

我想要在Perl代碼中實現超時以實現可移植性,而不是使用某些操作系統特定的函數(如ulimit)。

+1

這是一個重複多次比我可以指望:http://stackoverflow.com/questions/2679582/how-can-i-kill-a-perl-system-call-after-a -timeout http://stackoverflow.com/questions/1962985/how-can-i-timeout-a-forked-process-that-might-hang http://stackoverflow.com/questions/2423288/ways-to-do -timeouts-in-perl http://stackoverflow.com/questions/3427401/perl-make-script-timeout-after-x-number-of-seconds http://stackoverflow.com/questions/1165316/how-can -i-limit-the-time-in-a-specific-section-of-perl-script只是其中的一小部分。 – Ether 2010-10-19 16:05:58

回答

27

查看alarm函數。從莢果例如:

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 
} 

上有CPAN模塊,其包裹這些起來有點更很好,爲例如:Time::Out

use Time::Out qw(timeout) ; 

timeout $nb_secs => sub { 
    # your code goes were and will be interrupted if it runs 
    # for more than $nb_secs seconds. 
}; 

if ([email protected]){ 
    # operation timed-out 
} 
+0

這似乎工作,但問題是通過系統調用執行的命令將繼續運行,即使父Perl過程已經死亡。有誰知道如何獲得由系統調用運行的進程的進程ID /句柄,以便我們可以在Perl腳本結束之前將其終止? – antred 2017-02-17 10:53:29

+1

@antred - 要獲得進程ID,則需要使用['fork'](http://perldoc.perl.org/perlfork.html)而不是['system'](http:// perldoc。 perl.org/functions/system.html)。看一下像IPC :: Cmd&IPC :: Run這樣的模塊,使其更容易(在這種情況下)。 – draegtun 2017-02-19 13:44:37

13

可以使用IPC::Run的運行方法,而不是系統。並設置超時。

3

System::Timeout怎麼樣?

該模塊擴展system以允許在指定秒數後超時。

timeout("3", "sleep 9"); # timeout exit after 3 seconds 
+0

僅當內容移動或更改時,僅鏈接答案纔有用。在回答中加入鏈接的相關部分,並根據問題進行量身定製。 – miken32 2017-01-31 20:29:26

+0

一個潛在解決方案的鏈接總是值得歡迎的,但請[在鏈接周圍添加上下文](http://meta.stackexchange.com/a/8259),以便您的同行用戶瞭解它是什麼以及它爲什麼在那裏。如果目標網站無法訪問或永久離線,請始終引用重要鏈接中最相關的部分。考慮到僅僅是一個鏈接到外部網站是一個可能的原因[爲什麼和如何刪除一些答案?](http://stackoverflow.com/help/deleted-answers)。 – FelixSFD 2017-01-31 20:29:36

+1

@ miken32編輯。 – melpomene 2017-01-31 20:53:51