
誰かが私に正しい方向を伝えることができるかどうか疑問に思います。私はLinuxコマンドラインを使った経験がほとんどありません。最近の職場でのさまざまな要因のために、いくつかの知識を学ぶ必要があります。
デフォルトでは、php
私のサーバーのディレクトリには2つのスクリプトがあります。アプリケーションの目的のために、これらのスクリプトは継続的に実行する必要があります。現在これが私が実装する方法です。
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
実行中であることを確認し、そうでなければ実行/再起動するタスクの見通しについて考えることになりました。
誰かが私にこれを行う方法についての情報を与えることができますか?
答え1
クローンの仕事の概念に最初に触れたので、Davidannの答えを拡張したいと思います。すべてのUNIXまたはLinuxシステムには、どこかにcrontabが格納されています。 crontabはプレーンテキストファイルです。以下を考慮してください。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は隔月で毎日、毎時間、毎分毎に「I really like cron」をエコーしなければなりません。明らかに、cronが本当に好きな場合にのみこれを行います。 crontabはまた、1月と2月の毎日16:30に「I kind of cron」をエコーします。 1月1日3時10分には「私はクローンがあまり好きではありません」という回答も受けました。
cron 初心者としてアスタリスクの列をコメントアウトすることで、各列の機能を知ることができます。私が知っているすべてのCron実装はこの順番になっています。さて、Davidannの答えを私がコメントしたファイルとマージします。
#Mins Hours Days Months Day of week
* * * * * lockfile -r 0 /tmp/the.lock && php parse_tweets.php; rm -f /tmp/the.lock
各列に値が入力されていない場合、デフォルトは
毎時、毎時、毎月、-->1年を通して毎分です。
Davidannが述べたように、ロックファイルを使用すると、ファイルを「実行」するコマンドであるPHPインタプリタのコピーのみが実行され、行の最後のビットは次のphp parse_tweets.php
実行のために準備されたロックファイルを削除します。私は毎分ファイルを削除するのが好きではありませんが、それが必要な動作であれば、これは非常に受け入れ可能です。ディスクに書き込んで書き換えるのは個人的な好みにすぎません。
答え2
実行されていないときに別のcronを使用して起動するのではなく、cronを使用するのはどうですか?
たとえば、
* * * * * 'lockfile -r 0 /tmp/the.lock && (php parse_tweets.php; rm -f /tmp/the.lock)'
これにより、ロックファイルを使用して1分ごとに実行されるcronジョブが実行されるため、parse_tweets.php
一度に1つのcron実行コピーのみを実行できます。 (php parse_tweets.php
クローンの外で実行するのを防ぎません)
答え3
定期点検は便利でも信頼できません。スクリプトが停止すると、クローンジョブが再実行されるまで再起動されません。
持つプロセスが常に実行されることを保証するツール、supervise
例えばデーモンツール、監視装置、神、監督者待つ。起動時にモニタリングツールを起動し、そのままにしてください。
while true; do … done
粗雑で効果的な監視ツールですが、いくつかの予防措置を講じる必要があります。nohup
始まりだ。端末ではないように標準入力をリダイレクトする必要があります(一部の実装ではnohup
これを行うことができます)。出力をファイルに記録し、ファイルにエラーがないことを確認する必要があります。
nohup sh -c 'while true; do …; done' </dev/null >myscript.log 2>&1 &
また、シェルが終了時にジョブにシグナルを送信しないことを確認してください。シェルにdisown
組み込みコマンドがある場合は、それを実行してください。
多くのシステムでエントリを登録して、起動時にSupervisorを起動するようにスケジュールできます@reboot
。サポートされているcrontab(5)
ことを確認するには、システムのマニュアルページを確認してください@reboot
。
@reboot while true; do …; done </dev/null >myscript.log 2>&1