"syntax error: bad fd number"ってなんだ?


2009/09/19:追記:表題のエラーについて詳細に調査してみました。こちら


ほっとんどプログラミングの話題を扱っていなかったので、たまにはプログラミングの話題でも。
サーバにインストールしているFFmpeg::CommandのバージョンをPorts経由でバージョンアップしたところ、
このモジュールが稼働しなくなってしまった。何か異常があったのかと調査を始めたところ、

Syntax error: Bad fd number

との記録がApacheのerror.logに記載されているのを発見(CGIでモジュールを使っています)。
さらに試行錯誤を重ねた結果、どうやらこのモジュールに限らず

system("/bin/ls >& /dev/null");

上記のようにシェル上で/dev/nullへリダイレクトしようとすると須く同じエラーが発生するようだ。
FreeBSD7.2にするまでは……というよりつい最近までこんなエラーは出ていなかったはずなのだけど、
とりあえず根本的な原因を調査する時間はさほど用意出来なさそうなのでFFMpeg::Commandの問題の方は

    my $pid;

    if ($pid = fork()) {
        ;
    } elsif (!defined $pid) {
        close STDOUT;
        open STDOUT, ">& /dev/null" or exit -1;
        exec("$self->{ffmpeg} -version");
    }

    wait;

    if ($? != 0) {
        carp "Can't find ffmpeg command.";
        exit 0;
    }

逃げることにした(笑
diffると下記のような感じ。

 --- FFmpeg-Command-0.11/lib/FFmpeg/Command.pm   2009-06-07 15:57:29.000000000 +0900
 +++ /usr/local/lib/perl5/site_perl/5.8.9/FFmpeg/Command.pm      2009-07-20 21:14:35.000000000 +0900
 @@ -38,7 +38,19 @@
          timeout     => 0,
      };

 -    if ( system("$self->{ffmpeg} -version >& /dev/null") != 0 ) {
 +    my $pid;
 +
 +    if ($pid = fork()) {
 +       ;
 +    } elsif (!defined $pid) {
 +       close STDOUT;
 +       open STDOUT, ">& /dev/null" or exit -1;
 +       exec("$self->{ffmpeg} -version");
 +    }
 +
 +    wait;
 +
 +    if ($? != 0) {
          carp "Can't find ffmpeg command.";
          exit 0;
      }

折を見て根本的な原因を探っておかないと……