0

我已经阅读了很多关于这个主题的主题,并尝试了我遇到的所有问题:> /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因此它永远不会自行重新启动。

一个例外是 echo | 现在,这似乎很有希望,但是如果我在命令行上复制一些有效的东西并在 mod_perl 脚本中执行它,我会得到一个很好的成功的声音,job 1 at 2013-10-31 19:20但是什么都没有发生。没有带有 的外壳邮件,没有带有and/or的now -m错误消息,没有来自我自己的模块的电子邮件,通常在 any 上执行此操作,没有来自自动记录所有内容的日志文件。尽管成功线只是一个无声的失败。2>&1> /path/with/all/777/permsdie

如果它有帮助,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
}

这在以前看起来很简单,并且有很多建议的解决方案,但似乎没有一个能做到。还有什么要检查或尝试的?

4

1 回答 1

0

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

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

然后在 $command 中调用的脚本中,我只是将这些行放在 httpd 重新启动之前:

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

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

同时,包含重新启动的脚本通过我之前在那里使用的相同的旧 STDOUT 重定向正确地生成日志,并通过电子邮件发送给我die

此外,包含重新启动的脚本在命令行中正常工作,正如它也是设计的那样。

于 2013-11-01T15:44:28.760 回答