我正在从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
答案 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 );
}