2

PHPスクリプトのコピーが常に実行されていることを確認するために、cronで毎分実行している次のシェルスクリプトがあります。

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。では、プロセスとcrontab からpsの呼び出しの両方がまだ実行中であることがわかります。sh私はこれがなぜ起こっているのかを何ヶ月も理解しようとしてきました。die()ループが妥当な時間以上続く場合は、すべての while ループに余分なコードを入れてメールしてください.

今日、私は重要な証拠を手に入れました。プロセスが 2 日間実行されていたことを確認して強制終了した後、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でハングアップしていた理由を知りたい.

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 コマンドは Fatal Error で終了し、setlock が完了し、background-process.sh スクリプトが終了し、cronjob 全体が実行されたはずです。ストリームのパイピングや setlock の何らかの副作用のために、何かおかしなことが起こっているのではないかと思います。私はどちらについても、次にどこを見るべきかを知るのに十分なほど知りません.

4

0 に答える 0