Ich weiß, das ist alt, aber für alle Interessierten gibt es eine nicht blockierende Konstante, die Sie an flock übergeben können, damit sie zurückkehrt, anstatt zu blockieren.
File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
Update für slhck
flock
wird true zurückgeben, wenn dies Der Prozess hat die Sperre erhalten, andernfalls false. Um sicherzustellen, dass jeweils nur ein Prozess ausgeführt wird, möchten Sie nur versuchen, die Sperre zu erhalten, und beenden, wenn dies nicht möglich ist. Es ist so einfach wie das Setzen einer exit unless
vor der Codezeile habe ich oben:
exit unless File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
Obwohl dies Ihre Frage nicht direkt beantwortet, würde ich an Ihrer Stelle wahrscheinlich ein Daemon-Skript schreiben (Sie könnten http://daemons.rubyforge.org/ verwenden)
Sie könnten Ihren Indexer (unter der Annahme seiner indexer.rb) durch ein Wrapper-Skript namens script/index laufen lassen, zum Beispiel:
require 'rubygems'
require 'daemons'
Daemons.run('indexer.rb')
Und Ihr Indexer kann fast dasselbe tun, außer dass Sie ein Ruheintervall angeben
loop do
# code executing your indexing
sleep INDEXING_INTERVAL
end
So funktionieren normalerweise Job-Prozessoren zusammen mit einem Queue-Server.
Sie könnten eine temporäre Datei erstellen und löschen und prüfen, ob diese Datei existiert. Bitte überprüfen Sie die Antwort auf diese Frage:ein Instanz-Shell-Skript
Abhängig von Ihren Anforderungen sollte dies problemlos funktionieren und es muss nirgendwo eine weitere Datei erstellt werden.
exit unless DATA.flock(File::LOCK_NB | File::LOCK_EX)
# your script here
__END__
DO NOT REMOVE: required for the DATA object above.