2013-07-18 3 views
4

Я тестировал Git :: Repository с моим скриптом fcgi. Я не могу создать объект git и не запускать какую-либо команду git с помощью этого модуля. IPC :: open3 :: open3 терпит неудачу с ошибкой:perl: IPC :: Open3 не открывается STDERR с FCGI

Not a GLOB reference at /usr/local/lib/perl/5.10.1/FCGI.pm line 125

Я добавил Кликнув в FCGI :: Open() и предостеречь в IPC :: open3 :: XOpen() и вот что я получил :

mod_fcgid: stderr: IPC::Open3::xopen() called with args: GLOB(0xe92360) <&=5 
mod_fcgid: stderr: IPC::Open3::xopen() called with args: GLOB(0xe92438) >&=9 
mod_fcgid: stderr: IPC::Open3::xopen() called with args: GLOB(0xe92498) >&=12 
mod_fcgid: stderr: FCGI::OPEN() called with args: FCGI::Stream=SCALAR(0x14e43f0) >&=12 
mod_fcgid: stderr: at /usr/local/lib/perl/5.10.1/FCGI.pm line 125 
mod_fcgid: stderr: \tFCGI::Stream::OPEN('FCGI::Stream=SCALAR(0x14e43f0)', '>&=12') called at /usr/share/perl/5.10/IPC/Open3.pm line 67 
mod_fcgid: stderr: \tIPC::Open3::xopen('GLOB(0xe92498)', '>&=12') called at /usr/share/perl/5.10/IPC/Open3.pm line 162 
mod_fcgid: stderr: 
mod_fcgid: stderr: \tIPC::Open3::_open3('open3', 'MyModule', 'GLOB(0x1a56078)', 'GLOB(0x1906738)', 'GLOB(0x12f5430)' , '/usr/bin/git', '--version') called at /usr/share/perl/5.10/IPC/Open3.pm line 233 
mod_fcgid: stderr: \tIPC::Open3::open3('GLOB(0x1a56078)', 'GLOB(0x1906738)', 'GLOB(0x12f5430)', '/usr/bin/git', '--version') called at /usr/local/lib/site_perl/MyModule.pm line 113 

FCGI :: OPEN() вызывается только при открытии STDERR. STDIN и STDOUT не достигают FCGI :: OPEN(). Я посмотрел на IPC :: open3 и это, где это не удается:

if ($dad_rdr ne $dad_err) { 
    if ($dup_err) { 
     # I have to use a fileno here because in this one case 
     # I'm doing a dup but the filehandle might be a reference 
     # (from the special case above). 
     xopen \*STDERR, ">&" . xfileno($dad_err) 
      if fileno(STDERR) != xfileno($dad_err); 
    } else { 
     xclose $dad_err; 
     xopen \*STDERR, ">&=" . fileno $kid_err; # this is failing 
    } 
} else { 
    xopen \*STDERR, ">&STDOUT" if fileno(STDERR) != fileno(STDOUT); 
} 

я могу заменить open3 с IPC :: Run :: начать и все работает отлично. Но мне очень нравится понимать, что здесь происходит с STDERR. Это ошибка с FCGI.pm или Open3.pm или я делаю что-то неправильно?

Я запускаю apache 2.2.16 с libapache2-mod-fcgid 1: 2.3.6, libfcgi-perl 0.71-1 и libcgi-fast-perl 5.10.1 на debian squeeze. Версия Perl - 5.10.1.

Как воспроизвести:

use CGI::Fast; 
use Symbol(); 
use IPC::Open3 qw(open3); 

while (my $cgi = new CGI::Fast) { 
    my $pid; 
    my $in = Symbol::gensym; 
    my $out = Symbol::gensym; 
    my $err = Symbol::gensym;  

    $pid = open3($in, $out, $err, '/usr/bin/git', '--version'); 

} 
+0

Вы не упомянули, какие версии модулей вы используете. – Mithaldu

+2

Это упоминается непосредственно перед моим примером кода. –

+0

Dang, извините. Я не привык читать имена пакетов Linux. :) – Mithaldu

ответ

Смежные вопросы