“待处理信号的最大数量(120)超过”是什么意思?

时间:2010-02-21 17:58:00

标签: perl fastcgi mod-fastcgi

在Apache mod_fastcgi下运行的My Perl web-app经常会出现类似的错误 以下内容:

  

第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);
}

2 个答案:

答案 0 :(得分:7)

这意味着操作系统向Perl传递信号的速度比处理它们的速度快,并且已达到饱和点。在操作之间,Perl保存要处理的信号,然后在有机会时处理它们。你得到这个错误是因为在Perl有机会屏住呼吸之前收到的信号太多了。这是致命错误,因此您的Perl进程终止。

解决方案是找出产生如此多信号的因素。有关详细信息,请参阅 here


更新:我原来的回答有点不准确,说生成一个新的Perl进程是问题的一部分,实际上并非如此。我根据@ ysth的评论更新了。

答案 1 :(得分:2)

我会手持波浪,因为我很久没有使用过mod_fastcgi了,自从我查看它的文档以来已经有一段时间了。

我猜你的Perl模块是非分叉的,但需要一段时间才能运行,这样客户端关闭需要一段时间来处理。请参阅FastCGI Apache模块mod_fastcgi下的 Notes ,了解FastCGI使用的信号,以及程序如何处理这些信号,包括SIGPIPE