Je sais que c'est ancien, mais pour toute personne intéressée, il existe une constante non bloquante que vous pouvez transmettre à flock afin qu'elle revienne au lieu de bloquer.
File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
Mise à jour pour slhck
flock
renverra true si ceci processus a reçu le verrou, false sinon. Donc, pour vous assurer qu'un seul processus est en cours d'exécution à la fois, vous voulez juste essayer d'obtenir le verrou et quitter si vous n'y parvenez pas. C'est aussi simple que de mettre un exit unless
devant la ligne de code que j'ai ci-dessus :
exit unless File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
Bien que cela ne réponde pas directement à votre question, si j'étais vous, j'écrirais probablement un script démon (vous pouvez utiliser http://daemons.rubyforge.org/)
Vous pourriez avoir votre indexeur (en supposant que son indexer.rb) soit exécuté via un script wrapper nommé script/index par exemple :
require 'rubygems'
require 'daemons'
Daemons.run('indexer.rb')
Et votre indexeur peut faire presque la même chose, sauf que vous spécifiez un intervalle de sommeil
loop do
# code executing your indexing
sleep INDEXING_INTERVAL
end
C'est ainsi que fonctionnent généralement les processeurs de travaux en tandem avec un serveur de file d'attente.
Vous pouvez créer et supprimer un fichier temporaire et vérifier l'existence de ce fichier.Veuillez vérifier la réponse à cette question :un script shell d'instance
Selon vos besoins, cela devrait fonctionner correctement et ne nécessite pas la création d'un autre fichier n'importe où.
exit unless DATA.flock(File::LOCK_NB | File::LOCK_EX)
# your script here
__END__
DO NOT REMOVE: required for the DATA object above.