誰かが私を正しい方向に向けるかどうか疑問に思っています。 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
ジョブの可能性を調査しました。
誰も私にこれについてどうやって行くかについてのいくつかの情報を提供することができますか?
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
各列に値を入力しないと、デフォルトで次のようになります。
毎週、毎月、毎時間、毎分->年間を通して毎分。
Davidannがロックファイルを使用すると、phpインタープリターのコピーが1つだけ実行されることが保証されるため、php parse_tweets.php
はファイルを「実行」するコマンドであり、行の最後のビットはロックファイルを削除して次の準備をします実行します。毎分ファイルを削除するのは好きではありませんが、これが必要な動作である場合は、これで十分です。ディスクへの書き込みと再書き込みは個人的な好みにすぎません
実行されていない場合に起動するために別の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
を実行することはできません)
定期的なチェックは便利でも信頼性でもありません。スクリプトが停止した場合、cronジョブが再度実行されるまでスクリプトは再起動されません。
プロセスが常に実行されていることを確認するためのツール 、たとえば daemontools からのsupervise
など、 monit 、 god 、 supervisord など。起動時に監視ツールを起動し、そのままにしておきます。
_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
_