2013-11-01 25 views
0

我已阅读了有关此主题的许多线索,并尝试了我遇到的所有内容:> /dev/null,qx,system,exec,fork,cmd with | (在win32下工作,但现在我正在移植到使用prefork MPM的CentOS),echo |现在还有Proc :: Daemon,但我还没有尝试过Apache2 :: Subprocess,因为它看起来正是我不想要的东西,这是一个与父代绑定的线程。如何从mod_perl2中释放一个杀死父项的进程

也许我的情况有所不同。在长时间运行的数据库恢复过程结束时,我想重新启动脚本运行的httpd服务。抛开这种设计的智慧问题,我该怎么做?我试过的每种方法都会在执行的一半时立即停止脚本,因此它不会再次自行启动。

一个例外是回声|现在看起来很有希望,但是如果我复制一些在命令行上执行并在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

双分叉和/或开始一个新的会话和/或开始一个新的进程组。检出Daemon :: Daemonize,如果不使用它,则使用它的代码。 – ikegami

+0

@ikegami,我安装了Daemon :: Daemonize,没有选项,它不起作用,并且'close =>'std',它也不起作用。在这两种情况下,该进程都会与其父进程一起死掉,并且无法成功重新启动httpd。我不确定双叉应该如何帮助,如果两个新进程在父进程时仍然死机。 – Kev

+0

也就是说,我将我的'system()'调用放在Daemonize的'run'子目录中。 – Kev

回答

0

终于成功的是从Apache2 :: SubProcess的文档中窃取提示。

在mod_perl脚本中,我只是做qx($command 2>&1),虽然其他方法也可能工作。

然后在脚本中调用在$命令,我只是把这些线的httpd重新启动之前:

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

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

与此同时,包含重新启动的脚本通过旧的STDOUT重定向生成日志,然后通过电子邮件发送给我,如果有的话die s。

此外,包含重新启动的脚本通常可以从命令行运行,因为它也是用来执行的。