我正在使用主管(http://supervisord.org/)来守护一个相当标准的 PHP 脚本。该脚本的结构类似于:
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 服务器上运行。
请让我知道我是否可以分享任何其他信息,如果它有助于提供更棒的解决方案。
谢谢!
沙希布·R。