Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何从Perl运行进程并捕获输出和返回代码?_Multithreading_Perl_Process_Fork - Fatal编程技术网

Multithreading 如何从Perl运行进程并捕获输出和返回代码?

Multithreading 如何从Perl运行进程并捕获输出和返回代码?,multithreading,perl,process,fork,Multithreading,Perl,Process,Fork,我想用Perl(一个命令行PHP脚本)运行一个单独的进程。我想捕获这个过程的输出和返回代码。或者,如果进程花费的时间超过N秒,我希望能够终止进程并继续。我应该调查什么?你可以试试 IPC::Run-system()和后台进程,带管道、redirs和PTY(Unix、Win32) 您可以使用pipedopen()实现所有3个目标: my $pid = open(F, "cat /etc/passwd |") || die "Cant open pipe: $!"; eval { # Gi

我想用Perl(一个命令行PHP脚本)运行一个单独的进程。我想捕获这个过程的输出和返回代码。或者,如果进程花费的时间超过N秒,我希望能够终止进程并继续。我应该调查什么?你可以试试

IPC::Run-system()和后台进程,带管道、redirs和PTY(Unix、Win32)


您可以使用pipedopen()实现所有3个目标:

my $pid = open(F, "cat /etc/passwd |") || die "Cant open pipe: $!";
eval {
     # Give 30 secs to read output:
     local $SIG{ALRM} = sub { kill(9, $pid); die "alarm\n"; }; # NB: \n required
     alarm(30);

     # Read output:
     my $line = <F>;
     alarm(0); # Remove alarm

     #..do job with $line
};
# Get errorcode:
close(F);
print "Exit status: $?\n";
printf "Exit value(return code): %d\n", $?>>8;
print "Killed by timeout\n" if ($? & 127)==9;
my$pid=open(F,“cat/etc/passwd |”)| | die“无法打开管道:$!”;
评估{
#给30秒读取输出:
本地$SIG{ALRM}=sub{kill(9,$pid);die“alarm\n”};#NB:\n必需
警报(30);
#读取输出:
我的$line=;
警报(0);#移除警报
#…用$line完成工作
};
#获取错误代码:
关闭(F);
打印“退出状态:$?\n”;
printf“退出值(返回代码):%d\n”,$?>>8;
如果($?&127)==9,则打印“超时终止\n”;

EXIT\u ANY
告诉捕获允许任何退出值;您可以改为列出允许的异常(
capture([0,1,42],…)
),如果遇到其他异常,capture将抛出异常。默认情况下(如果只传递一个命令来捕获),任何非零的退出值都会导致异常。

就我个人而言,我发现最简单的方法是使用::run\u cmd和计时器。这里不需要在事件循环下运行整个程序,我今天经常使用这个解决方案进出事件循环。(以下警告不安全。)


这是一个常见问题。也看看这个。它基本上解释了在Perl中运行外部命令的方法。

不考虑问题的可选部分,您可以在backticks中获取命令的输出,并在特殊变量
$?
中获取其返回值

my$output=`shell_命令`;
如果($?),则为die(“shell_命令失败!\n”);

现在显示“Perl”,您的评论可以删除。请不要将编辑还原为大写。:)确实如此
use IPC::System::Simple qw/EXIT_ANY $EXITVAL capture/;

my $output = capture(EXIT_ANY, 'some command');
print "exit value was $EXITVAL\n";
use AnyEvent;
use AnyEvent::Util;

my ($stdout, $stderr, $pid);

my $cv = AnyEvent::Util::run_cmd [ $^X, -e => '$|++; sleep 2; print "foo\n"; sleep 2' ],
    '>'  => \$stdout,
    '2>' => \$stderr,
    '$$' => \$pid,
;

my $w = AnyEvent->timer(after => 3, interval => 0, cb => sub { print "killing!\n"; kill SIGINT => $pid });

my $rc = $cv->recv();
$w = undef; # end the timer.

print "got rc = [$rc]\n";
print "stdout = [$stdout]\n";
print "stderr = [$stderr]\n";