GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso assicurarmi che sia in esecuzione solo un'istanza di uno script Ruby alla volta?

So che questo è vecchio, ma per chiunque sia interessato, c'è una costante non bloccante che puoi passare a flock in modo che ritorni invece di bloccare.

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

Aggiornamento per slhck

flock restituirà true se this il processo ha ricevuto il blocco, false in caso contrario. Quindi, per assicurarti che sia in esecuzione un solo processo alla volta, vuoi solo provare a ottenere il blocco e uscire se non sei stato in grado di farlo. È semplice come inserire un exit unless davanti alla riga di codice che ho sopra:

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

Anche se questo non risponde direttamente alla tua domanda, se fossi in te probabilmente scriverei uno script demone (potresti usare http://daemons.rubyforge.org/)

Potresti fare in modo che il tuo indicizzatore (supponendo che sia indexer.rb) venga eseguito tramite uno script wrapper denominato script/index, ad esempio:

require 'rubygems'
require 'daemons'

Daemons.run('indexer.rb')

E il tuo indicizzatore può fare quasi la stessa cosa, tranne per il fatto che specifichi un intervallo di sospensione

loop do
   # code executing your indexing 

   sleep INDEXING_INTERVAL
end

Questo è il modo in cui di solito funzionano i job processor in tandem con un queue server.


Puoi creare ed eliminare un file temporaneo e verificare l'esistenza di questo file. Controlla la risposta a questa domanda:script di shell di un'istanza


A seconda delle tue esigenze, dovrebbe funzionare bene e non richiede la creazione di un altro file da nessuna parte.

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. Quattro compiti in parallelo... Come farlo?

  2. Come spostare una riga in un file di testo su o giù di una riga?

  3. Come creare un file temporaneo nello script della shell?

  4. Come assicurarsi che venga eseguita solo un'istanza di uno script Bash?

  5. Eseguire uno script ogni volta che viene installato un nuovo kernel?

Come posso controllare la sintassi di uno script Bash senza eseguirlo?

Variabile in Bash Script che mantiene il valore dall'ultima esecuzione

Come creare un file solo se non esiste?

Come includere un file in uno script di shell bash

sposta solo se il file esiste in uno script di shell

Limita un programma gui in Linux a una sola istanza