Saya tahu ini sudah lama, tetapi bagi siapa pun yang tertarik, ada konstanta non-pemblokiran yang dapat Anda teruskan ke flock sehingga ia kembali, bukan memblokir.
File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
Pembaruan untuk slhck
flock
akan mengembalikan true jika ini proses menerima kunci, salah jika tidak. Jadi untuk memastikan hanya satu proses yang berjalan pada satu waktu, Anda hanya ingin mencoba mendapatkan kuncinya, dan keluar jika Anda tidak bisa. Sesederhana meletakkan exit unless
di depan baris kode yang saya miliki di atas:
exit unless File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )
Meskipun ini tidak secara langsung menjawab pertanyaan Anda, jika saya jadi Anda, saya mungkin akan menulis skrip daemon (Anda dapat menggunakan http://daemons.rubyforge.org/)
Anda dapat membuat pengindeks Anda (dengan asumsi pengindeksnya.rb) dijalankan melalui skrip pembungkus bernama skrip/indeks misalnya:
require 'rubygems'
require 'daemons'
Daemons.run('indexer.rb')
Dan pengindeks Anda dapat melakukan hal yang hampir sama, kecuali Anda menentukan interval tidur
loop do
# code executing your indexing
sleep INDEXING_INTERVAL
end
Beginilah biasanya pemroses pekerjaan bersama-sama dengan server antrean berfungsi.
Anda dapat membuat dan menghapus file sementara dan memeriksa keberadaan file ini. Silakan periksa jawaban untuk pertanyaan ini:skrip shell satu contoh
Bergantung pada kebutuhan Anda, ini akan berfungsi dengan baik dan tidak perlu membuat file lain di mana pun.
exit unless DATA.flock(File::LOCK_NB | File::LOCK_EX)
# your script here
__END__
DO NOT REMOVE: required for the DATA object above.