进程在PHP致命错误后继续运行

时间:2013-10-30 22:06:34

标签: php linux sh

我有以下shell脚本,我每分钟都在cron中运行,以确保PHP脚本的副本始终在运行:

MY_DIR=`dirname $0`
/usr/local/bin/setlock -n /tmp/newdb.$1.lock /usr/local/bin/php $MY_DIR/background/$1.php

通过cronjob调用:

*  *  *  *  *  ~/mysite/background-process.sh new-min-max-dispatcher

它运行的php脚本用于执行大约30分钟然后退出的任务,之后cron将重新启动该进程。这几乎在所有时间都有效,但每隔一段时间这个过程就永远不会退出。当脚本在STDERR上产生大量输出时,似乎会发生这种情况。

但是,我无法通过简单地强制脚本输出类似于STDERR的数量来重现该行为。在ps中,我可以看到进程和来自crontab的sh调用仍然在运行。我一直试图弄清楚为什么会发生这种情况几个月,包括将额外的代码放入die()的每个while循环中,如果循环超过一段合理的时间,则给我发电子邮件。

今天我得到了一个重要的证据。在发现该过程已运行两天并将其删除后,我通过cronjob从脚本中通过电子邮件发送STDERR,结束于:

Fatal error: Maximum execution time of 3600 seconds exceeded in /home/myuser/mysite/inc/browser.php on line 102
/home/myuser/mysite/background-process.sh: line 2: 28189 Terminated
/usr/local/bin/setlock -n -x /tmp/newdb.$1.lock /usr/local/bin/

我并不担心PHP脚本达到了它的最大执行时间 - 这可能发生。我想知道为什么如果PHP脚本死于致命错误,该过程仍然在ps中,以及用于启动它的sh命令cron:

myuser 32091  0.0  0.0   8892  1104 ?        Ss   Oct28   0:00 /bin/sh -c ~/mysite/background-process.sh new-min-max-dispatcher 
myuser 32142 46.7  5.2 328788 131920 ?       R    Oct28  63:24 /usr/local/bin/php /home/myuser/mysite/background/new-min-max-dispatcher.php

正如我所看到的,php命令应该以致命错误结束,导致setlock完成,background-process.sh脚本完成,整个cronjob完成。我怀疑由于溪流的管道或setlock的一些副作用,可能会有一些奇怪的事情发生。我不知道要么知道下一步要去哪里。

0 个答案:

没有答案