有時我的系統調用進入一個永無止境的狀態。爲了避免我希望能夠在指定的時間後突破呼叫。如何爲Perl系統調用指定超時限制?
有沒有辦法指定system
的超時限制?
system("command", "arg1", "arg2", "arg3");
我想要在Perl代碼中實現超時以實現可移植性,而不是使用某些操作系統特定的函數(如ulimit)。
有時我的系統調用進入一個永無止境的狀態。爲了避免我希望能夠在指定的時間後突破呼叫。如何爲Perl系統調用指定超時限制?
有沒有辦法指定system
的超時限制?
system("command", "arg1", "arg2", "arg3");
我想要在Perl代碼中實現超時以實現可移植性,而不是使用某些操作系統特定的函數(如ulimit)。
查看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
}
這似乎工作,但問題是通過系統調用執行的命令將繼續運行,即使父Perl過程已經死亡。有誰知道如何獲得由系統調用運行的進程的進程ID /句柄,以便我們可以在Perl腳本結束之前將其終止? – antred 2017-02-17 10:53:29
@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
可以使用IPC::Run的運行方法,而不是系統。並設置超時。
僅當內容移動或更改時,僅鏈接答案纔有用。在回答中加入鏈接的相關部分,並根據問題進行量身定製。 – miken32 2017-01-31 20:29:26
一個潛在解決方案的鏈接總是值得歡迎的,但請[在鏈接周圍添加上下文](http://meta.stackexchange.com/a/8259),以便您的同行用戶瞭解它是什麼以及它爲什麼在那裏。如果目標網站無法訪問或永久離線,請始終引用重要鏈接中最相關的部分。考慮到僅僅是一個鏈接到外部網站是一個可能的原因[爲什麼和如何刪除一些答案?](http://stackoverflow.com/help/deleted-answers)。 – FelixSFD 2017-01-31 20:29:36
@ miken32編輯。 – melpomene 2017-01-31 20:53:51
這是一個重複多次比我可以指望: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