2008-09-01 14 views
5

¿Hay alguna manera fácil de saber si una secuencia de comandos de ruby ​​ya se está ejecutando y luego manejarla correctamente? Por ejemplo: tengo un script llamado really_long_script.rb. Lo tengo cronned para que se ejecute cada 5 minutos. Cuando se ejecuta, quiero ver si la ejecución anterior aún se está ejecutando y luego detener la ejecución del segundo script. ¿Algunas ideas?Determine si ya se está ejecutando una secuencia de comandos de ruby ​​

Respuesta

9

El PS es una manera muy mala de hacerlo y, probablemente, abierta a condiciones de carrera.

La manera tradicional de Unix/Linux sería escribir el PID en un archivo (generalmente en/var/run) y verificar si ese archivo existe al inicio.

p. Ej. el archivo pid se encuentra en /var/run/myscript.pid y luego verifica si existe antes de ejecutar el programa. Hay algunos trucos para evitar las condiciones de carrera que implican el uso de O_EXCL (bloqueo de exclusión) para abrir el archivo y los enlaces simbólicos.

Por improbable que sea, debe intentar codificar para evitar condiciones de carrera mediante el uso de operaciones atómicas en el sistema de archivos.

Para guardar reinventar la rueda, es posible que desee ver en http://rubyforge.org/projects/pidify/

0

En bash:

if ps aux | grep really_long_script.rb | grep -vq grep 
then 
    echo Script already running 
else 
    ruby really_long_script.rb 
fi 
0

Debería probablemente comprobar que el proceso se está ejecutando, por lo que si la secuencia de comandos muere sin limpiar a sí misma, se ejecutará la la próxima vez en lugar de simplemente verificar que /var/run/foo.pid exista y exista.

0

Highlander

Descripción

Una joya que asegura sólo una instancia de la secuencia de comandos principal se está ejecutando. En resumen, solo puede haber uno.

instalación

gem install highlander 

Sinopsis

require 'highlander' # This should be the -first- thing in your code. 
# Your code here 

Mientras tanto, en la línea de comandos ...

# First attempt, works. Assume it's running in the background. 
ruby your_script.rb 

# Second attempt while the first instance is still running, fails. 
ruby your_script.rb # => RuntimeError 

Notas

Simplemente requiere la gema Highlander asegura tha t solo una instancia de esa secuencia de comandos no se puede iniciar de nuevo. Si intenta volver a iniciarlo , se generará un RuntimeError.

Cuestiones relacionadas