cronよりもインテリジェントにサーバージョブをスケジュールする方法は?


15

サイトのコンテンツのインデックスを再作成するジョブを毎分実行しています。

今日、検索エンジンは死に、私がログインしたとき、cronによって開始された何百もの孤立プロセスがありました。

毎分ジョブを実行できる既存のソフトウェアを使用する別の方法がありますが、そのジョブが返されない場合(つまり、検索エンジンプロセスが失敗したため)別のインスタンスを起動しませんか?


4
cronは、ほとんどの場合、あなたが言っていることを正確に実行しています。代わりに、ジョブをインテリジェントに書き換えることをお勧めします。
gparent

回答:


27

問題は実際には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がファイルのロックを取得できなかった場合は失敗します。


2
愚かな質問かもしれませんが、通常のファイルではなく、特にディレクトリを使用する利点はありますか?
ペアレント

9
通常のファイルを使用するには、いくつかの操作が必要です。作成しない場合は、存在するかどうかを確認してください。これにより、別のプロセスがファイルを作成する機会が与えられます-面倒です。mkdirはアトミックな操作であり、動作して「ロック」を取得するか、別のプロセスがすでに持っているため、ロックを取得しません。
user9517

理にかなっています。ロックディレクトリについてもよく考えてください。ありがとう
ジョン

2

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のようなもの」を探すことができます。


0

これをすばやく設定する別の方法は、マシンの起動時にシェルスクリプトを起動することです(cronは ' @reboot /path/to/my/script.sh'でこれを行うことができます。その後、cronを再起動して起動します)。

#!/bin/sh
/opt/bin/run-site-index
sleep 60
exec $0

スクリプトは実行を続け、1つだけを開始しました-一度に実行できるのはそれだけです-それだけです。そこの一部のスマートは、インデクサーが実行されているかどうかを確認し、実行されていない場合、再起動するか、問題の修正/通知を試みることができます。


-3

このためにcronを使用する代わりに、ループで実行され、最後のステップとして60秒間スリープするサービスとしてジョブを構築します。または、プロセスのさまざまなポイントで短い間隔でより頻繁にスリープし、負荷を分散します。より均等に。


1
これは問題を解決することも、cronからの改善になることもありません。
gparent

これで問題が解決します。これは、実行されるプロセスが1つしかないためです。cronを完全に回避します。
ジョエルCoel

検索エンジンが実行されている場合に「サービス」が表示されない場合、問題は解決しません。彼のスクリプト/ジョブのロジックが問題です。編集:実際には、あなたはいくぶん正しいです、それはissueい方法で問題を隠すでしょう。
gparent
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.