Почему IPC::Run3 не может захватить стандартный вывод в среде Apache?

%use IPC::Run3;
%my $a;
%run3 ['echo','hello'],\undef,\$a;
<% $a %>

Приведенный выше код mason работает очень хорошо, когда я использую Mason из автономного скрипта, как описано в HTML::Mason::Admin. К сожалению, при работе с perl_mode $a является пустой строкой. Ниже мой httpd.conf

 Alias /mason_book /home/charlse/f/books/mason_book
 <Location /mason_book>
    SetHandler perl-script
    AddHandler perl-script .mas
    PerlHandler HTML::Mason::ApacheHandler
    PerlAddVar  MasonCompRoot  "mason_book => /home/charles/f/books/mason_book"
 </Location>
 <Directory "/home/chunywan/f/books/mason_book">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
 </Directory>

Кстати

 %use IPC::Run qw(run timeout);
 %my @cmd=qw(echo hello world);
 %my ($in,$out,$err);
 %run(\@cmd, \$in, \$out, \$err) or die "cat: $?";
 <pre>
   out <% $out %>
 </pre>

Я просто пробую IPC::Run, который очень хорошо работает как в автономном режиме, так и в режиме mod_perl. Кажется, мне нужно обновить весь мой исходный код, чтобы использовать IPC::Run вместо IPC::Run3.


person wcy    schedule 25.04.2013    source источник
comment
Какая ошибка была возвращена?   -  person ikegami    schedule 25.04.2013
comment
@ikegami, я включил PerlSetEnv IPCRUN3DEBUG 1, журнал ошибок показывает, что run3 выполняет команду правильно, а $? равно нулю.   -  person wcy    schedule 25.04.2013


Ответы (1)


Я считаю, что решение состоит в том, чтобы временно повторно открыть STDIN/STDOUT, а затем закрыть его после завершения вашей команды.

use IPC::Run3;
my $a;

#save off existing stdin/out
my ($save_stdin,$save_stdout);
open $save_stdin, '>&STDIN';
open $save_stdout, '>&STDOUT';

#open it again as the "normal things"
open STDIN, '>&=0';
open STDOUT, '>&=1';
run3 ['echo','hello'],\undef,\$a;

#clean up after yourself
close(STDIN);
close(STDOUT);
open STDIN, '>&', $save_stdin;
open STDOUT, '>&', $save_stdout;

Я столкнулся с той же проблемой с IPC::Open3 и решил ее здесь: https://stackoverflow.com/a/24311232/312208< /а>

person Ryley    schedule 19.06.2014