回答:
問題は実際にはcronではなく、あなたの仕事にあります。
いくつかの説明のロックとジョブを対話させる必要があります。これを行う最も簡単な方法は、ディレクトリの作成を試み、成功した場合は終了せずに続行することです。ジョブが終了して終了すると、次の実行に備えてディレクトリが削除されます。以下に説明するスクリプトを示します。
#!/bin/bash
function cleanup {
echo "Cleanup"
rmdir /tmp/myjob.lck
}
mkdir /tmp/myjob.lck || exit 1
trap cleanup EXIT
echo 'Job Running'
sleep 60
exit 0
これを1つの端末で実行し、60秒が経過する前に別の端末で実行すると、ステータス1で終了します。最初のプロセスが終了すると、2番目の端末から実行できます...
編集:
群れについて学んだばかりなので、この答えを更新すると思いました。
flock(1)は使いやすいかもしれません。この場合、flock -n
たとえば
* * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job
ジョブは毎分実行されますが、flockがファイルのロックを取得できなかった場合は失敗します。
1つの方法は、インデックスファイルの再作成スクリプトでロックファイルを作成し、実行中のスクリプトのインスタンスが既に存在するかどうかを確認できるようにすることです。いくつかの例外処理を追加して、検索エンジンが稼働しているかどうかを確認することもできます。
より複雑な代替手段は、ResqueやResque-schedulerなどのタスクキューラーを使用することです。
https://github.com/blog/542-introducing-resque
https://github.com/bvandenbos/resque-scheduler#readme
QuとSidekiqもあります:
https://github.com/bkeepers/qu
https://github.com/mperham/sidekiq
はい、それはすべてRuby指向ですが、選択した言語で「resqueのようなもの」を探すことができます。
これをすばやく設定する別の方法は、マシンの起動時にシェルスクリプトを起動することです(cronは ' @reboot /path/to/my/script.sh
'でこれを行うことができます。その後、cronを再起動して起動します)。
#!/bin/sh
/opt/bin/run-site-index
sleep 60
exec $0
スクリプトは実行を続け、1つだけを開始しました-一度に実行できるのはそれだけです-それだけです。そこの一部のスマートは、インデクサーが実行されているかどうかを確認し、実行されていない場合、再起動するか、問題の修正/通知を試みることができます。
このためにcronを使用する代わりに、ループで実行され、最後のステップとして60秒間スリープするサービスとしてジョブを構築します。または、プロセスのさまざまなポイントで短い間隔でより頻繁にスリープし、負荷を分散します。より均等に。