7

我的 Perl web 应用程序在 Apache mod_fastcgi 下运行,经常出现如下错误:

在第 119 行超过了未决信号的最大计数 (120)。

我已经看到这种情况与文件上传有关,但我不确定这是唯一一次发生。在我收到该错误之前(或可能之后)我也得到了一个 SIGPIPE。

有什么想法吗?

编辑 感谢大家的建议。有人问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 Apache 模块mod_fastcgi下有关 FastCGI 使用的信号的注释,以及程序可能希望如何处理这些信号,包括.SIGPIPE

于 2010-02-21T18:24:26.213 回答