如何为Perl系统调用指定超时限制?
有时,我的系统调用会进入一个永无止境的状态。为了避免,我希望能够在指定的时间后中断呼叫 有没有办法为指定超时限制 为了便于移植,我希望从Perl代码中实现超时,而不是使用某些特定于操作系统的函数,如ulimit。请参阅函数。pod中的示例:如何为Perl系统调用指定超时限制?,perl,system,Perl,System,有时,我的系统调用会进入一个永无止境的状态。为了避免,我希望能够在指定的时间后中断呼叫 有没有办法为指定超时限制 为了便于移植,我希望从Perl代码中实现超时,而不是使用某些特定于操作系统的函数,如ulimit。请参阅函数。pod中的示例: eval { local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required alarm $timeout; $nread = sysread SOCKET, $buffer,
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
}
CPAN上有一些模块将这些模块包装得更为美观,例如:
您可以使用的run方法而不是system。并设置一个超时。怎么样
此模块扩展系统
,以允许在指定秒后超时
我以前在Perl+Linux中使用过
timeout
命令,您可以这样测试:
for(0..4){
my $command="sleep $_"; #your command
print "$command, ";
system("timeout 1.1s $command"); # kill after 1.1 seconds
if ($? == -1 ){ printf "failed to execute: $!" }
elsif($?&127 ){ printf "died, signal %d, %scoredump", $?&127, $?&128?'':'no '}
elsif($?>>8==124){ printf "timed out" }
else { printf "child finished, exit value %d", $? >> 8 }
print "\n";
}
4.317秒后的输出:
sleep 0, child finished, exit value 0
sleep 1, child finished, exit value 0
sleep 2, timed out
sleep 3, timed out
sleep 4, timed out
timeout
命令是所有主要的“正常”Linux发行版a.f.a.i.k的一部分,coreutils的一部分。这是一个重复的次数,我无法计数:仅为数不多。当内容移动或更改时,仅链接的答案没有帮助。在您的回答中包含链接的相关部分,并根据问题量身定制。始终欢迎指向潜在解决方案的链接,但请确保您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。考虑到仅仅是一个指向外部站点的链接是一个可能的原因。这似乎是可行的,但问题是通过系统调用执行的命令将继续运行,即使父Perl进程已经死亡。是否有人知道如何获取系统调用运行的进程的进程id/句柄,以便我们可以在Perl脚本结束之前杀死它?@antred-要获取进程id,则需要使用而不是。看看IPC::Cmd和IPC::Run之类的模块,让这更容易(在本文中)。我不知道为什么这个答案不高。在“运行系统调用时”的上下文中,使用系统解决方案似乎恰到好处,而且简单直接。非常适合“perl作为粘合代码”。谢谢下一次我编写perl应用程序时,IPC::Run将获得成功,但不管怎样,当我进行开发时,这是正确的。
timeout("3", "sleep 9"); # timeout exit after 3 seconds
for(0..4){
my $command="sleep $_"; #your command
print "$command, ";
system("timeout 1.1s $command"); # kill after 1.1 seconds
if ($? == -1 ){ printf "failed to execute: $!" }
elsif($?&127 ){ printf "died, signal %d, %scoredump", $?&127, $?&128?'':'no '}
elsif($?>>8==124){ printf "timed out" }
else { printf "child finished, exit value %d", $? >> 8 }
print "\n";
}
sleep 0, child finished, exit value 0
sleep 1, child finished, exit value 0
sleep 2, timed out
sleep 3, timed out
sleep 4, timed out