So che questo è vecchio, ma per chiunque sia interessato, c'è una costante non bloccante che puoi passare a flock in modo che ritorni invece di bloccare.
File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
Aggiornamento per slhck
flock
restituirà true se this il processo ha ricevuto il blocco, false in caso contrario. Quindi, per assicurarti che sia in esecuzione un solo processo alla volta, vuoi solo provare a ottenere il blocco e uscire se non sei stato in grado di farlo. È semplice come inserire un exit unless
davanti alla riga di codice che ho sopra:
exit unless File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
Anche se questo non risponde direttamente alla tua domanda, se fossi in te probabilmente scriverei uno script demone (potresti usare http://daemons.rubyforge.org/)
Potresti fare in modo che il tuo indicizzatore (supponendo che sia indexer.rb) venga eseguito tramite uno script wrapper denominato script/index, ad esempio:
require 'rubygems'
require 'daemons'
Daemons.run('indexer.rb')
E il tuo indicizzatore può fare quasi la stessa cosa, tranne per il fatto che specifichi un intervallo di sospensione
loop do
# code executing your indexing
sleep INDEXING_INTERVAL
end
Questo è il modo in cui di solito funzionano i job processor in tandem con un queue server.
Puoi creare ed eliminare un file temporaneo e verificare l'esistenza di questo file. Controlla la risposta a questa domanda:script di shell di un'istanza
A seconda delle tue esigenze, dovrebbe funzionare bene e non richiede la creazione di un altro file da nessuna parte.
exit unless DATA.flock(File::LOCK_NB | File::LOCK_EX)
# your script here
__END__
DO NOT REMOVE: required for the DATA object above.