【问题标题】:How to fork a process from mod_perl2 that kills its parent如何从 mod_perl2 派生一个杀死其父进程的进程
【发布时间】:2013-11-12 04:59:03
【问题描述】:

我已经阅读了许多关于这个主题的主题,并尝试了我遇到的所有问题:> /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 这样的成功的听起来不错的行,但是什么也没有发生。没有带有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
}

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

【问题讨论】:

  • 双叉和/或启动新会话和/或启动新进程组。查看 Daemon::Daemonize,如果不使用它,则使用它的代码。
  • @ikegami,我安装了 Daemon::Daemonize,没有选项,它不起作用,而使用close => 'std,它也不起作用。在这两种情况下,进程都与它的父进程一起死亡,并且没有成功重新启动 httpd。我不确定双叉应该如何提供帮助,如果两个新进程在父进程时仍然死亡。
  • 也就是说,我将我的 system() 调用放在 Daemonize 的 run 子中。
  • 重启httpd之后你想在你的进程中做什么?
  • @ysth,不多,但问题是,它只是在重新启动中途。 IE。它会停止,但是与父母一起被杀,无法启动。所以之后停止 httpd这才是最重要的......

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


【解决方案1】:

最终奏效的是从 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 重定向正确地生成日志,如果有问题,会通过电子邮件发送给我dies。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    相关资源
    最近更新 更多