web-dev-qa-db-ja.com

PHPスクリプトが実行されているかどうかを確認するcronジョブ、実行されていない場合は実行されます

誰かが私を正しい方向に向けるかどうか疑問に思っています。 Linuxコマンドラインでの作業経験はほとんどありませんが、最近はさまざまな要因により、知識を得る必要がありました。

基本的に、サーバーのディレクトリにある2つのphpスクリプトがあります。アプリケーションの目的のために、これらのスクリプトは継続的に実行されている必要があります。現在、私はそれをこのように実装しています:

Nohup sh -c 'while true; do php get_tweets.php; done' >/dev/null &

そして

Nohup sh -c 'while true; do php parse_tweets.php; done' >/dev/null &

ただし、無限ループにもかかわらず、スクリプトが定期的に停止することに気づき、スクリプトを再起動せざるを得なくなりました。なぜだかわかりませんが、そうです。そのため、実行中かどうかを確認し、実行されていない場合は実行/再起動するCRONジョブの可能性を調査しました。

誰も私にこれについてどうやって行くかについてのいくつかの情報を提供することができますか?

4
Javacadabra

Cronジョブの概念は初めてなので、Davidannの答えを詳しく説明します。すべてのUNIXまたはLinuxシステムには、どこかにcrontabが保存されています。 crontabはプレーンテキストファイルです。以下を考慮してください:( CentのGentoo Wiki から)

#Mins  Hours  Days   Months  Day of the week
10     3      1      1       *       /bin/echo "I don't really like cron"
30     16     *      1,2     *       /bin/echo "I like cron a little"
*      *      *      1-12/2  *       /bin/echo "I really like cron"

このcrontabは、隔月、毎日、毎時、毎分、「Icronが本当に好き」とエコーします。もちろん、本当にcronが本当に好きな場合にのみそうするでしょう。また、crontabは、1月と2月の毎日16:30に「少しcronが好き」とエコーします。また、1月1日の3:10に「私はcronが本当に好きではない」とエコーします。

Cronを初めて使用する場合は、スター付きの列にコメントを付けて、各列が何に使用されているかを理解する必要があります。私が知っているすべてのCron実装は常にこの順序でした。次に、Davidanの回答とコメントファイルをマージします。

#Mins  Hours  Days   Months  Day of week
  *     *      *      *       *   lockfile -r 0 /tmp/the.lock && php parse_tweets.php; rm -f /tmp/the.lock

* * * * * lockfile -r 0 /tmp/the.lock && php get_tweets.php; rm -f /tmp/the.lock

各列に値を入力しないと、デフォルトで次のようになります。
毎週、毎月、毎時間、毎分->年間を通して毎分。

Davidannがロックファイルを使用すると、phpインタープリターのコピーが1つだけ実行されることが保証されるため、php parse_tweets.phpはファイルを「実行」するコマンドであり、行の最後のビットはロックファイルを削除して次の準備をします実行します。毎分ファイルを削除するのは好きではありませんが、これが必要な動作である場合は、これで十分です。ディスクへの書き込みと再書き込みは個人的な好みにすぎません

7
eyoung100

実行されていない場合に起動するために別のcronを用意するのではなく、cronだけを使用しないのはなぜですか?

例えば。:

* * * * * 'lockfile -r 0 /tmp/the.lock && (php parse_tweets.php; rm -f /tmp/the.lock)'

これにより、ロックファイルを使用してparse_tweets.phpを1分に1回実行するcronジョブが実行されるため、一度に実行されるcronによって実行されるコピーは1つだけになります。 (ただし、cronの外でphp parse_tweets.phpを実行することはできません)

4
David Weiser

定期的なチェックは便利でも信頼性でもありません。スクリプトが停止した場合、cronジョブが再度実行されるまでスクリプトは再起動されません。

プロセスが常に実行されていることを確認するためのツール 、たとえば daemontools からのsuperviseなど、 monitgodsupervisord など。起動時に監視ツールを起動し、そのままにしておきます。

_while true; do … done_は粗雑ですが効果的な監視ツールですが、いくつかの予防策を講じる必要があります。 Nohupが始まりです。ターミナルではないように、標準入力をリダイレクトするようにしてください(Nohupの一部の実装はそれを行います)。出力をファイルに記録し、エラーが発生した場合はそのファイルを確認してください。

_Nohup sh -c 'while true; do …; done' </dev/null >myscript.log 2>&1 &
_

また、シェルが終了するときに、シェルがそのジョブにシグナルを送信しないことを確認してください。シェルにdisownが組み込まれている場合は、それを実行します。

多くのシステムでは、_@reboot_エントリを登録することにより、起動時にスーパーバイザが起動するように調整できます。システムのcrontab(5)のマニュアルページで、_@reboot_がサポートされているかどうかを確認してください。

_@reboot while true; do …; done </dev/null >myscript.log 2>&1
_