如何以异步方式在Perl中运行系统命令?

前端之家收集整理的这篇文章主要介绍了如何以异步方式在Perl中运行系统命令?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前有一个在系统上运行外部命令的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;
}
原文链接:https://www.f2er.com/Perl/171514.html

猜你在找的Perl相关文章