7

Apache mod_fastcgi で実行されている私の Perl Web アプリは、次のようなエラーを頻繁に受け取ります。

119 行目で保留中のシグナルの最大数 (120) を超えました。

ファイルのアップロードに関連してこれが発生するのを見てきましたが、それが発生するのはそれだけではありません。また、そのエラーが発生する直前 (または場合によっては直後) に SIGPIPE が発生します。

何かご意見は?

EDIT みんなの提案に感謝します。誰かが 119 行目とは何かと尋ねました。申し訳ありませんが、それを入れる必要がありました。これは、アップロードされたファイルに対してウイルス チェッカーを実行するコード ブロックにあります。毎回エラーが発生するわけではなく、たまにしか発生しません。

if(open VIRUS_CK, '|/usr/local/bin/clamscan - --no-summary >'.$tmp_file) {

  print VIRUS_CK $data; // THIS IS LINE 119

  close VIRUS_CK;

  if (($? >> 8) == 1) {

    open VIRUS_OUTPUT, '<'.$tmp_file;
    my $vout = <VIRUS_OUTPUT>;
    close VIRUS_OUTPUT;
    $vout =~ s/^stdin:\s//;
    $vout =~ s/FOUND$//;


    print STDERR "virus found on upload: $vout\n";
    return undef, 'could not accept attachment, virus found: '.$vout;
  }
  unlink($tmp_file);
}
4

2 に答える 2

7

これは、オペレーティング システムが信号を処理できるよりも速く Perl に送信しており、飽和点に達したことを意味します。操作の合間に、Perl は処理するシグナルを保存し、機会があればそれらを処理します。Perl が一息つく前に受信したシグナルが多すぎるため、このエラーが発生します。これは致命的なエラーであるため、Perl プロセスは終了します。

解決策は、非常に多くの信号を生成している原因を突き止めることです。詳しくはこちらをご覧ください。


更新:新しい Perl プロセスの生成が問題の一部であると述べた私の最初の回答は、実際にはそうではなかったのに、やや不正確でした。以下の@ysthのコメントに基づいて更新しました。

于 2010-02-21T18:06:03.660 に答える
2

長い間mod_fastcgiを使用していなかったので、手が震えます。ドキュメントを見てからしばらく経ちました。

Perlモジュールはフォークされていないと思いますが、実行に時間がかかるため、クライアントを閉じると処理に時間がかかります。FastCGIで使用されるシグナル、およびプログラムがこれらのシグナルを処理する方法については、 FastCGIApacheモジュールmod_fastcgiのを参照してください。SIGPIPE

于 2010-02-21T18:24:26.213 に答える