我用fcgi脚本测试Git::Repository。我既不能创建git对象,也不能使用该模块运行任何git命令。IPC::Open3::Open3失败,错误为:
在/usr/local/lib/perl/5.10.1/FCGI.pm第125行中没有GLOB参考
我在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);
}
我可以用IPC::Run::start代替open3,一切都很好。但我真的很想了解STDERR到底出了什么问题。是FCGI.pm或Open3.pm的错误,还是我做错了什么?
我在debian crush上运行带有libapache2 mod fcgid 1:2.3.6、libfcgi perl 0.71-1和libcgi fast perl 5.10.1的apache 2.2.16。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');
}
这应该在最新版本(1.102)的系统命令中修复:https://metacpan.org/release/BOOK/System-Command-1.102。
补丁是https://github.com/book/System-Command/commit/d5009728cc66e5f9bb2057df4be70648571a29cd