如何从mod_perl2中分叉一个杀死其父级的进程

时间:2013-11-01 00:57:01

标签: perl centos fork apache2.2 mod-perl2

我已经阅读了很多有关此主题的主题,并尝试了我遇到的所有内容:> /dev/null,qx,system,exec,fork,cmd with | (在win32下运行,但现在我正在移植到使用prefork MPM的CentOS),echo |现在和Proc :: Daemon一样,但是我没有尝试过Apache2 :: Subprocess,因为它看起来就像我不想要的那样,一个与父母绑定的线程。

也许我的情况不同。在长时间运行的数据库还原过程结束时,我想重新启动运行该脚本的httpd服务。抛开这种设计智慧的问题,我怎么能这样做呢?我试过的每一个方法都会在执行sudo service httpd stop sudo service httpd restart的{​​{1}}一半后立即停止脚本所以它永远不会再次自己开始。

一个例外是echo |现在,这似乎很有希望,但如果我复制一些在我在命令行上执行并在mod_perl脚本中执行它的东西,我会得到一个很好的成功的声音线,如job 1 at 2013-10-31 19:20但是没有任何反应。没有包含now -m的shell邮件,没有2>&1和/或> /path/with/all/777/perms的错误消息,没有来自我自己的模块的电子邮件通常会在任何die上执行此操作,没有日志文件从自动记录所有内容的相同内容。尽管取得了成功,但只是一场无声的失败。

如果有帮助,这是service httpd stop运行的内容:

stop() {
        echo -n $"Stopping $prog: "
        kill -TERM `cat ${pidfile}`
        RETVAL=$?
        if [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
        then success
        else failure
        fi
        echo
}

之前看起来很简单,有很多建议的解决方案,但似乎都没有。还有什么可以检查或尝试?

1 个答案:

答案 0 :(得分:0)

最终起作用的是从Apache2 :: SubProcess'文档中窃取提示。

在mod_perl脚本中,我只是做qx($command 2>&1),但其他方法也可能有效。

然后在$ command中调用脚本,我只是将这些行放在httpd restart:

之前
use POSIX 'setsid';
setsid or die "Can't start a new session: $!";

它永远不会返回到mod_perl脚本,这很好,因为我还是会重定向到日志显示页面。

与此同时,包含重启的脚本通过我之前的相同旧STDOUT重定向正确生成日志,如果die s,则发送电子邮件给我。

此外,包含重启的脚本在命令行中正常工作,因为它也是设计用的。