停止httpd导致从perl CGI脚本开始的进程接收SIGTERM

时间:2013-07-01 07:37:41

标签: perl apache unix cgi signals

我正在从perl CGI脚本运行shell脚本:

#!/usr/bin/perl
my $command = "./script.sh &";
my $pid = fork();
if (defined($pid) && $pid==0) {
        # background process
        system( $command );
}

shell脚本如下所示:

#!/bin/sh
trap 'echo trapped' 15
tail -f test.log

当我从浏览器运行CGI脚本,然后使用/etc/init.d/httpd stop停止httpd时,脚本会收到SIGTERM信号。

我原本希望脚本作为一个单独的进程运行,而不是依赖于httpd。虽然我可以捕获SIGTERM,但我想了解脚本为什么接收SIGTERM。

我在这里做错了什么?我正在运行RHEL 5.8和Apache HTTP服务器2.4。

谢谢, Pranav

1 个答案:

答案 0 :(得分:1)

您正在产生的进程仍然附加了httpd的父PID。所以这可能有用:

use POSIX qw / setsid /;
...
my $command = "./script.sh";
my $pid = fork();
if (defined $pid && $pid == 0) {
    close *STDIN;
    close *STDOUT;
    close *STDERR;
    setsid;
    system( $command );
    exit 0;
}

因为听起来你的过程不应该回到你的脚本,你甚至可以做

use POSIX qw / setsid /;
...
my $command = "./script.sh";
my $pid = fork();
if (defined $pid && $pid == 0) {
    close *STDIN;
    close *STDOUT;
    close *STDERR;
    setsid;
    exec( $command );
}