2

我有以下 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中,我可以看到进程和sh来自 crontab 的调用仍在运行。几个月来,我一直试图弄清楚为什么会发生这种情况,包括在每个 while 循环中添加额外的代码,die()如果循环持续的时间超过合理的时间,我会发邮件给我。

今天我得到了一个重要的证据。在发现进程已经运行了两天并将其杀死后,我收到了 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 的某些副作用可能会发生一些奇怪的事情。我对任何一个都不太了解,甚至不知道下一步该往哪里看。

4

0 回答 0