Sé que esto es antiguo, pero para cualquier persona interesada, hay una constante sin bloqueo que puede pasar a flock para que regrese en lugar de bloquear.
File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
Actualización para slhck
flock
devolverá verdadero si este el proceso recibió el bloqueo, falso de lo contrario. Entonces, para asegurarse de que solo se esté ejecutando un proceso a la vez, solo debe intentar obtener el bloqueo y salir si no pudo. Es tan simple como poner un exit unless
delante de la línea de código que tengo arriba:
exit unless File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
Aunque esto no responde directamente a su pregunta, si yo fuera usted, probablemente escribiría un script daemon (podría usar http://daemons.rubyforge.org/)
Podría hacer que su indexador (suponiendo que sea indexer.rb) se ejecute a través de un script contenedor llamado script/index, por ejemplo:
require 'rubygems'
require 'daemons'
Daemons.run('indexer.rb')
Y su indexador puede hacer casi lo mismo, excepto que especifica un intervalo de suspensión
loop do
# code executing your indexing
sleep INDEXING_INTERVAL
end
Así es como suelen funcionar los procesadores de trabajos en tándem con un servidor de colas.
Puede crear y eliminar un archivo temporal y verificar la existencia de este archivo. Verifique la respuesta a esta pregunta:secuencia de comandos de shell de una instancia
Dependiendo de sus necesidades, esto debería funcionar bien y no requiere crear otro archivo en ninguna parte.
exit unless DATA.flock(File::LOCK_NB | File::LOCK_EX)
# your script here
__END__
DO NOT REMOVE: required for the DATA object above.