我有一些可能长期存在的CGI应用程序必须清理它们的环境,无论它们是否正常完成,或者它们是否被Apache杀死,因为它们花费的时间太长。他们使用共享内存,所以我不能依赖操作系统的正常进程清理机制。
当他们超时时,Apache如何杀死它的CGI孩子?我找不到任何关于它是如何完成的文档或规范,也没有找到它可能让孩子拦截它以便它可以干净地关闭。
答案 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)
答案 3 :(得分:0)
请注意,如果这些任务实际上花费的时间太长而且客户端没有真正的回复,那么无论何时收到此类请求,您都可以在服务器上启动后台进程。
这当然意味着您可能希望确保不会启动后台进程超过一定次数(可能只有一次),并且您可以让该进程将信息保存在文件或共享内存中,以便客户可以检查进度。
不允许后台进程启动太多次会节省服务器内存/ CPU ...否则会无响应。
这样你就不用太担心Apache会杀死你的漫长过程,因为它不再有超时问题。