我目前有一个Perl脚本,它在系统上运行外部命令,收集输出,并根据返回的内容执行一些操作.现在,这是我如何运行它(其中$ cmd是一个带有命令设置的字符串):
@output = `$cmd`;
Run Code Online (Sandbox Code Playgroud)
我想改变它,所以如果命令挂起并且在这么多时间之后没有返回值,那么我就杀了命令.我将如何异步运行此操作?
tse*_*see 12
有很多方法可以做到这一点:
如果你真的只需要在给定的系统调用上设置超时,这比异步编程要简单得多.
你需要的只是eval()块内的alarm().
下面是一个示例代码块,它将这些代码块放入一个可以放入代码中的子例程中.该示例调用sleep,因此输出并不令人兴奋,但确实显示了您感兴趣的超时功能.运行它的输出是:
/ bin/sleep 2 failure:在./time-out第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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7583 次 |
| 最近记录: |