GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya memastikan hanya satu contoh skrip Ruby yang berjalan pada satu waktu?

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.

Linux
  1. Empat Tugas Secara Paralel… Bagaimana Melakukannya?

  2. Bagaimana Cara Memindahkan Garis Dalam File Teks Ke Atas Atau Ke Bawah Dengan Satu Baris?

  3. Bagaimana Membuat File Sementara Di Shell Script?

  1. Bagaimana Memastikan Hanya Satu Contoh Skrip Bash yang Berjalan?

  2. Bagaimana Cara Memeriksa Kemajuan Running Cp?

  3. Script Mengeksekusi Loop Hanya Sekali?

  1. Apa cara terbaik untuk memastikan hanya satu contoh skrip Bash yang berjalan?

  2. Bagaimana cara menyorot skrip Bash di Vim?

  3. Bagaimana cara mengukur waktu eksekusi rata-rata sebuah skrip?