4

私は 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);
}

open3 を IPC::Run::start に置き換えると、すべて正常に動作します。しかし、ここで STDERR の何が問題なのかを理解したいと思っています。FCGI.pm または Open3.pm のバグですか、それとも何か間違っていますか?

debian スクイーズで、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');

}
4

1 に答える 1

1

これは、System-Command の最新バージョン (1.102) で修正する必要があります: https://metacpan.org/release/BOOK/System-Command-1.102

パッチは https://github.com/book/System-Command/commit/d5009728cc66e5f9bb2057df4be70648571a29cdです

于 2013-07-26T15:56:07.273 に答える