我正在使用supervisor(http://supervisord.org/)来守护一个相当标准的PHP脚本。该脚本的结构是这样的:如何检测PHP CLI脚本处于挂起状态
while (1) {
// Do a SQL select
// for any matching rows, do something
// if I have been running for longer than 60 mins, exit
}
今天,这个脚本(它已经相当稳定一段时间了)挂起。它没有崩溃(即发出SIGHUP或者SIGTERM信号),这会提醒supervisord重启该过程。它在处理过程中没有遇到任何错误,这些错误或者被脚本捕获,或者至少引发了致命的错误并退出。而不是这些“可捕捉”的场景,它只是坐在那里。我们确实有一个cron作业设置,每小时运行一次以通过supervisorctl钩子重新启动脚本,因为似乎普遍认为PHP脚本在内存方面存在漏洞,如果长时间运行,很可能会重新启动。重启后,脚本正常恢复运行。
我的问题:我如何检测到这个脚本已经挂起?我甚至无法开始诊断或解决这个问题,为什么它挂起,如果我不知道该状态的警报。我正在寻找这方面的软件解决方案,或者我可以采用一些方法来自己编写解决方案(无论是PHP,Python,Perl还是shell)。
该脚本使用PHP 5.2.6编写,并在最新的RHEL 5服务器上运行。
请让我知道,如果我可以分享任何额外的信息,如果它可以帮助一个更真棒的解决方案。
谢谢!
Shaheeb R.
mysql_free_result是defini非常有趣,以前没有遇到过。关于您建议尝试从外部脚本记录和监视此日志:这对我们可能是可行的。我们已经在脚本中执行应用程序日志记录,因此它将构成日志观察器来监视它。 –
作为日志观察者,我们取得了SEC(http://simple-evcorr.sourceforge.net/)的良好成功,我们可以使用此工具构建解决方案。我得说,我很希望有一个'现成的'解决方案! –