Что означает «Превышено максимальное количество ожидающих сигналов (120)»? - PullRequest
7 голосов
/ 21 февраля 2010

Мое веб-приложение на Perl, работающее под Apache mod_fastcgi, часто получает такие ошибки, как следующее:

Максимальное количество ожидающих сигналов (120) превышено в строке 119.

Я видел, как это происходило при загрузке файлов, но я не уверен, что это единственный раз, когда это происходит. Я также получаю 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 ]

7 голосов
/ 21 февраля 2010

Это означает, что операционная система передает сигналы в Perl быстрее, чем она может их обработать, и точка насыщения достигнута. Между операциями Perl сохраняет сигналы для обработки, а затем обрабатывает их, как только у него появляется шанс. Вы получаете эту ошибку, потому что слишком много сигналов было получено, прежде чем Perl смог перевести дыхание. Это фатальная ошибка, поэтому ваш процесс Perl завершается.

Решение состоит в том, чтобы выяснить, что генерирует так много сигналов. Подробнее см. здесь .

<Ч />

Обновление: Мой первоначальный ответ был несколько неточным, говоря, что генерация нового процесса Perl была частью проблемы, хотя на самом деле это не так. Я обновил на основе комментария @ ysth ниже.

2 голосов
/ 21 февраля 2010

Я буду волнистым, потому что я давно не использовал mod_fastcgi, и я давно не смотрел его документацию.

Я предполагаю, что ваш Perl-модуль не разветвляется, но требует времени для запуска, так что закрытие клиента занимает некоторое время для обработки. См. Примечания в модуле FastCGI Apache mod_fastcgi о сигналах, используемых FastCGI, и о том, как программы могут захотеть обрабатывать эти сигналы, включая SIGPIPE.

...