これが古いことは承知していますが、興味のある方は、flock に渡して、ブロックする代わりに返すことができる非ブロック定数があります。
File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
slhck の更新
flock
これの場合は true を返します プロセスがロックを受け取りました。それ以外の場合は false。したがって、一度に 1 つのプロセスだけが実行されるようにするには、ロックを取得して、取得できなかった場合は終了する必要があります。 exit unless
を入れるのと同じくらい簡単です 上記のコード行の前に:
exit unless File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
これはあなたの質問に直接答えているわけではありませんが、私があなただったら、おそらくデーモン スクリプトを書くでしょう (http://daemons.rubyforge.org/ を使用できます)
たとえば、script/index という名前のラッパー スクリプトを介してインデクサー (indexer.rb を想定) を実行することができます。
require 'rubygems'
require 'daemons'
Daemons.run('indexer.rb')
スリープ間隔を指定することを除いて、インデクサーはほぼ同じことを行うことができます
loop do
# code executing your indexing
sleep INDEXING_INTERVAL
end
これは、キュー サーバーと連携するジョブ プロセッサが通常どのように機能するかです。
一時ファイルを作成および削除し、このファイルの存在を確認できます。この質問への回答を確認してください:1 つのインスタンスのシェル スクリプト
必要に応じて、これは問題なく機能し、どこかに別のファイルを作成する必要はありません。
exit unless DATA.flock(File::LOCK_NB | File::LOCK_EX)
# your script here
__END__
DO NOT REMOVE: required for the DATA object above.