我目前有一个在系统上运行外部命令的Perl脚本,收集输出,并根据返回的内容执行一些操作.现在,这里是我如何运行它(其中$cmd是使用命令设置的字符串):
@output = `$cmd`;
我想改变这一点,所以如果命令挂起,并且在这么多时间后没有返回值,那么我会杀死命令.我如何去异步运行?
解决方法
如果您真的只需要在给定的系统调用上放置一个比异步编程更简单的问题的超时时间.
所有你需要的是在eval()块中的alarm().
这是一个示例代码块,将它们放入可以放入代码的子例程中.该示例调用睡眠,因此输出不是令人兴奋的,但会显示您感兴趣的超时功能.
运行的输出是:
/bin/sleep 2 failure: timeout at
./time-out line 15.
$cat time-out #!/usr/bin/perl use warnings; use strict; my $timeout = 1; my @cmd = qw(/bin/sleep 2); my $response = timeout_command($timeout,@cmd); print "$response\n" if (defined $response); sub timeout_command { my $timeout = (shift); my @command = @_; undef $@; my $return = eval { local($SIG{ALRM}) = sub {die "timeout";}; alarm($timeout); my $response; open(CMD,'-|',@command) || die "couldn't run @command: $!\n"; while(<CMD>) { $response .= $_; } close(CMD) || die "Couldn't close execution of @command: $!\n"; $response; }; alarm(0); if ($@) { warn "@cmd failure: $@\n"; } return $return; }