我已阅读了有关此主题的许多线索,并尝试了我遇到的所有内容:> /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
}
这似乎之前很简单,有这么多建议的解决方案,但他们都不做。还有什么要检查或尝试?
双分叉和/或开始一个新的会话和/或开始一个新的进程组。检出Daemon :: Daemonize,如果不使用它,则使用它的代码。 – ikegami
@ikegami,我安装了Daemon :: Daemonize,没有选项,它不起作用,并且'close =>'std',它也不起作用。在这两种情况下,该进程都会与其父进程一起死掉,并且无法成功重新启动httpd。我不确定双叉应该如何帮助,如果两个新进程在父进程时仍然死机。 – Kev
也就是说,我将我的'system()'调用放在Daemonize的'run'子目录中。 – Kev