GNU/Linux >> Znalost Linux >  >> Linux

Jak zajistím, že bude současně spuštěna pouze jedna instance skriptu Ruby?

Vím, že je to staré, ale pro každého, koho to zajímá, existuje neblokující konstanta, kterou můžete předat hejnu, aby se místo blokování vrátila.

File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )

Aktualizace pro slhck

flock vrátí hodnotu true, pokud toto proces přijal zámek, jinak je false. Chcete-li tedy zajistit, aby současně běžel pouze jeden proces, chcete se pokusit získat zámek a ukončit, pokud se vám to nepodařilo. Je to stejně jednoduché jako vložení exit unless před řádkem kódu, který mám výše:

exit unless File.new("/tmp/foo.lock").flock( File::LOCK_NB | File::LOCK_EX )

Ačkoli to není přímá odpověď na vaši otázku, na vašem místě bych pravděpodobně napsal skript démona (můžete použít http://daemons.rubyforge.org/)

Váš indexer (za předpokladu, že jeho indexer.rb) by mohl být spuštěn prostřednictvím skriptu wrapper s názvem script/index, například:

require 'rubygems'
require 'daemons'

Daemons.run('indexer.rb')

A váš indexátor může dělat téměř totéž, kromě toho, že určíte interval spánku

loop do
   # code executing your indexing 

   sleep INDEXING_INTERVAL
end

Takto obvykle fungují procesory úloh v tandemu se serverem fronty.


Můžete vytvořit a smazat dočasný soubor a zkontrolovat existenci tohoto souboru. Zkontrolujte prosím odpověď na tuto otázku:skript shellu jedné instance


V závislosti na vašich potřebách by to mělo fungovat dobře a nevyžaduje vytvoření dalšího souboru kdekoli.

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. Jak zvýraznit Bash skripty ve Vimu?

  2. přesunout pouze v případě, že soubor existuje ve skriptu shellu

  3. Omezte program gui v Linuxu pouze na jednu instanci

  1. Čtyři paralelní úkoly… Jak na to?

  2. Jak vytvořit dočasný soubor ve skriptu Shell?

  3. Jak měřit průměrnou dobu provádění skriptu?

  1. Jak se ujistit, že běží pouze jedna instance Bash skriptu?

  2. Spustit skript pokaždé, když je nainstalováno nové jádro?

  3. Spustí skript smyčku pouze jednou?