GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo me aseguro de que solo se esté ejecutando una instancia de un script de Ruby a la vez?

Sé que esto es antiguo, pero para cualquier persona interesada, hay una constante sin bloqueo que puede pasar a flock para que regrese en lugar de bloquear.

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

Actualización para slhck

flock devolverá verdadero si este el proceso recibió el bloqueo, falso de lo contrario. Entonces, para asegurarse de que solo se esté ejecutando un proceso a la vez, solo debe intentar obtener el bloqueo y salir si no pudo. Es tan simple como poner un exit unless delante de la línea de código que tengo arriba:

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

Aunque esto no responde directamente a su pregunta, si yo fuera usted, probablemente escribiría un script daemon (podría usar http://daemons.rubyforge.org/)

Podría hacer que su indexador (suponiendo que sea indexer.rb) se ejecute a través de un script contenedor llamado script/index, por ejemplo:

require 'rubygems'
require 'daemons'

Daemons.run('indexer.rb')

Y su indexador puede hacer casi lo mismo, excepto que especifica un intervalo de suspensión

loop do
   # code executing your indexing 

   sleep INDEXING_INTERVAL
end

Así es como suelen funcionar los procesadores de trabajos en tándem con un servidor de colas.


Puede crear y eliminar un archivo temporal y verificar la existencia de este archivo. Verifique la respuesta a esta pregunta:secuencia de comandos de shell de una instancia


Dependiendo de sus necesidades, esto debería funcionar bien y no requiere crear otro archivo en ninguna 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. Cuatro tareas en paralelo... ¿Cómo hacer eso?

  2. ¿Cuál es la mejor manera de garantizar que solo se ejecute una instancia de un script Bash?

  3. ¿Cómo resaltar los scripts de Bash en Vim?

  4. Cómo incluir un archivo en un script de shell bash

  5. Cómo ejecutar un script de shell al inicio

Linux:¿cómo encontrar la fecha de creación del archivo?

¿Cómo redirigir solo Stderr?

¿Cómo verifico la sintaxis de un script Bash sin ejecutarlo?

mover solo si el archivo existe en un script de shell

Limite un programa gui en Linux a una sola instancia

¿Cómo medir el tiempo medio de ejecución de un script?