在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);
}
答案 0 :(得分:7)
这意味着操作系统向Perl传递信号的速度比处理它们的速度快,并且已达到饱和点。在操作之间,Perl保存要处理的信号,然后在有机会时处理它们。你得到这个错误是因为在Perl有机会屏住呼吸之前收到的信号太多了。这是致命错误,因此您的Perl进程终止。
解决方案是找出产生如此多信号的因素。有关详细信息,请参阅 here 。
更新:我原来的回答有点不准确,说生成一个新的Perl进程是问题的一部分,实际上并非如此。我根据@ ysth的评论更新了。
答案 1 :(得分:2)
我会手持波浪,因为我很久没有使用过mod_fastcgi了,自从我查看它的文档以来已经有一段时间了。
我猜你的Perl模块是非分叉的,但需要一段时间才能运行,这样客户端关闭需要一段时间来处理。请参阅FastCGI Apache模块mod_fastcgi下的 Notes ,了解FastCGI使用的信号,以及程序如何处理这些信号,包括SIGPIPE
。