我有以下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的一些副作用,可能会有一些奇怪的事情发生。我不知道要么知道下一步要去哪里。