Уничтожение длинных процессов Fastcgi

У меня есть веб-приложение Perl Dancer, которое использует метод обслуживания mod_fastcgi из Apache2. Приложение должно принимать загруженные файлы. Когда пользователь загружает файл и нажимает кнопку остановки, процесс fastcgi зависает, работая на 100%, пока я вручную не остановлю процесс.

Есть ли какой-либо параметр, который может автоматически убить процесс, который так завис? Есть ли способ автоматически убить процесс fastcgi, который работает в течение определенного времени?


person mbergins    schedule 21.11.2013    source источник
comment
Я думаю, вам нужно сначала понять, почему он зависает на 100%, если это ошибка mod_fastcgi или ваш код. Если это ваш код, посмотрите, где он застревает, если это ошибка mod_fastcgi, откройте ошибку на их сайте.   -  person Noam Rathaus    schedule 26.11.2013


Ответы (2)


Нет, он не поддерживается mod_fastcgi.

Тем не менее, у вас есть несколько альтернатив:

  • Оберните свой Perl-код в модуль на основе тайм-аута, например Time::Out.
  • используйте ulimit -t, чтобы ядро ​​убило неуправляемый процесс, как только его квота ЦП закончилась.

Второе решение будет несколько сложно реализовать, так как вы не хотите убивать весь процесс apache. Более подробно это объясняется в вопросе Unix StackExchange.

person Steve Schnepp    schedule 07.12.2013
comment
Я не слышал о модуле Time::Out и протестировал его на той части своего кода, которая обрабатывает процесс загрузки. Похоже, функция загрузки танцора — это не та часть, которая висит, так что это должно быть что-то еще. - person mbergins; 08.12.2013

Поскольку функция, которая меня интересует, не является вариантом с mod_fastcgi, и я не могу найти часть кода, которую можно обернуть в Time::Out, чтобы убить процесс. Я думал, что поделюсь своим взломанным решением.

Я искал единственную команду linux, чтобы сделать это, но killall не работал (он специально не находил только команду perl, запускающую этот экземпляр сервера), и pkill тоже не работал (не мог указать возраст процесса для убийство).

Поэтому я написал короткий Perl-скрипт, который запускается от имени пользователя root, для уничтожения заданий с правильным именем и возрастом экземпляров сервера dancer mod_fastcgi:

#!/usr/bin/perl -w

use Proc::ProcessTable;

$t = new Proc::ProcessTable( 'cache_ttys' => 1 );  

foreach $p ( @{$t->table} ){
    if ($p->cmndline =~ /perl.*dispatch.fcgi/) {
        my $run_time_min = $p->time/(1000000*60);
        if ($run_time_min >= 15) {
            # print "Found this job to kill: ". $p->pid . $p->cmndline."\n". $run_time_min . "\n";
            kill 'KILL', $p->pid;
        }   
    }   
}
person mbergins    schedule 08.12.2013