加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 22:01:44 所属栏目:大数据 来源:网络整理
导读:我目前有一个在系统上运行外部命令的Perl脚本,收集输出,并根据返回的内容执行一些操作.现在,这里是我如何运行它(其中$cmd是使用命令设置的字符串): @output = `$cmd`; 我想改变这一点,所以如果命令挂起,并且在这么多时间后没有返回值,那么我会杀死命令.我如
我目前有一个在系统上运行外部命令的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 "$responsen" 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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读