Vím, že je to staré, ale pro každého, koho to zajímá, existuje neblokující konstanta, kterou můžete předat hejnu, aby se místo blokování vrátila.
File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
Aktualizace pro slhck
flock
vrátí hodnotu true, pokud toto proces přijal zámek, jinak je false. Chcete-li tedy zajistit, aby současně běžel pouze jeden proces, chcete se pokusit získat zámek a ukončit, pokud se vám to nepodařilo. Je to stejně jednoduché jako vložení exit unless
před řádkem kódu, který mám výše:
exit unless File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
Ačkoli to není přímá odpověď na vaši otázku, na vašem místě bych pravděpodobně napsal skript démona (můžete použít http://daemons.rubyforge.org/)
Váš indexer (za předpokladu, že jeho indexer.rb) by mohl být spuštěn prostřednictvím skriptu wrapper s názvem script/index, například:
require 'rubygems'
require 'daemons'
Daemons.run('indexer.rb')
A váš indexátor může dělat téměř totéž, kromě toho, že určíte interval spánku
loop do
# code executing your indexing
sleep INDEXING_INTERVAL
end
Takto obvykle fungují procesory úloh v tandemu se serverem fronty.
Můžete vytvořit a smazat dočasný soubor a zkontrolovat existenci tohoto souboru. Zkontrolujte prosím odpověď na tuto otázku:skript shellu jedné instance
V závislosti na vašich potřebách by to mělo fungovat dobře a nevyžaduje vytvoření dalšího souboru kdekoli.
exit unless DATA.flock(File::LOCK_NB | File::LOCK_EX)
# your script here
__END__
DO NOT REMOVE: required for the DATA object above.