Apache CGI Timeout - 它如何杀死和/或通知孩子?

时间:2011-01-10 12:23:43

标签: apache timeout cgi

我有一些可能长期存在的CGI应用程序必须清理它们的环境,无论它们是否正常完成,或者它们是否被Apache杀死,因为它们花费的时间太长。他们使用共享内存,所以我不能依赖操作系统的正常进程清理机制。

当他们超时时,Apache如何杀死它的CGI孩子?我找不到任何关于它是如何完成的文档或规范,也没有找到它可能让孩子拦截它以便它可以干净地关闭。

4 个答案:

答案 0 :(得分:3)

我找不到任何正式的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 :(得分:1)

Nop,Apache发送kill信号,此信号无法捕获或处理。所以信号处理程序在这种情况下什么都不做。

答案 2 :(得分:0)

看起来像apache什么都不做?我刚刚给我的一个perl cgi脚本添加了一个信号处理程序,这个脚本是Apache超时的,我什么都没得到:(

真的很遗憾。

答案 3 :(得分:0)

请注意,如果这些任务实际上花费的时间太长而且客户端没有真正的回复,那么无论何时收到此类请求,您都可以在服务器上启动后台进程。

这当然意味着您可能希望确保不会启动后台进程超过一定次数(可能只有一次),并且您可以让该进程将信息保存在文件或共享内存中,以便客户可以检查进度。

不允许后台进程启动太多次会节省服务器内存/ CPU ...否则会无响应。

这样你就不用太担心Apache会杀死你的漫长过程,因为它不再有超时问题。