Apache CGI Timeout - как он убивает и / или уведомляет ребенка? - PullRequest
3 голосов
/ 10 января 2011

У меня есть некоторые потенциально долгоживущие CGI-приложения, которые должны очистить свою среду независимо от того, завершаются ли они нормально или их убивает Apache, потому что они слишком долго. Они используют общую память, поэтому я не могу полагаться на обычные механизмы очистки процессов операционной системы.

Как Apache убивает своих детей CGI, когда у них заканчивается время? Я не могу найти какую-либо документацию или спецификацию о том, как это делается, и не возможно ли, чтобы ребенок перехватил это, чтобы он мог аккуратно отключиться.

Ответы [ 4 ]

3 голосов
/ 23 декабря 2013

Я не смог найти никакой официальной документации Apache по этому вопросу, но следующий скрипт показывает, что CGI-скрипты отправляются SIGTERM по таймауту, не SIGKILL (по крайней мере, в моей версии Apache, 2.2.15):

#!/usr/bin/perl

use strict;
use warnings;

use sigtrap 'handler' => \&my_handler, 'normal-signals';
use CGI;

sub my_handler {
    my ($sig) = @_;

    open my $fh, ">", "/var/www/html/signal.log" or die $!;
    print $fh "Caught SIG$sig";
    close $fh;
}

sleep 10 while 1;

Вывод:

Caught SIGTERM
1 голос
/ 27 апреля 2011

Нет, Apache посылает сигнал уничтожения, и этот сигнал не может быть перехвачен или обработан. Таким образом, обработчик сигнала ничего не делает в этом случае.

0 голосов
/ 04 сентября 2015

Обратите внимание, что в случае, если эти задачи действительно занимают слишком много времени и клиент не ожидает ответа, вы можете вместо этого запускать фоновый процесс на своем сервере, когда получаете такой запрос.

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

Не позволяя фоновому процессу запускаться слишком много раз, вы сэкономите память / ЦП сервера ... в противном случае он перестанет отвечать на запросы.

И таким образом вам не нужно слишком беспокоиться о том, что Apache убьет ваш долгий процесс, поскольку больше нет проблем с тайм-аутом.

0 голосов
/ 15 апреля 2011

похоже, что apache ничего не делает? Я просто добавил обработчик сигнала в один из моих сценариев Perl CGI, для которого истекло время ожидания Apache, и я ничего не получил: (

немного позора на самом деле.

...