2011-02-04 9 views
8

He hecho una pregunta diferente sobre la observación de directorios, que fue respondida, pero la otra mitad de la pregunta es cómo crear mejor un proceso sin fin, en ruby, para hacer esto. Éstos son los requisitos: (? Dios)cómo escribir un proceso robusto e interminable?

  • correr para siempre
  • ser controlables (es decir, saber si es hacia arriba o hacia abajo)
  • tienen algún tipo de forma para reanudar y asegurar que depende
  • inicio/parada con el Capistrano (estaría bien!)

Hemos visto BackgroundRb, pero que parece un poco anticuado, y para ser honesto no fiable! Hemos examinado DelayedJob, pero eso parece orientado a trabajos fuera de contrato (porque un trabajo interminable parece bloquear cualquier otro trabajo porque los trabajos se realizan secuencialmente).

Estamos ejecutando un montón de servidores de Ubuntu que forman nuestro entorno.

¿Alguna idea?

+0

suena como usted quiere escribir un servicio - esto es algo que el rubí, probablemente no está optimizado para – Marm0t

+1

@ Marm0t: ¿De dónde has sacado esa idea? Puede escribir un servicio en cualquier idioma de Turing completo. –

+0

¿Qué hará su proceso sin fin? Eso puede marcar una gran diferencia en cuál es la mejor solución. –

Respuesta

3

Tengo un bucle de máquina de eventos que rastrea algunos archivos de registro nginx y los coloca en MongoDB. Las secuencias de comandos "devorador de registros" se ejecutan con daemons ruby. http://daemons.rubyforge.org/

He encontrado que es mucho más confiable que Dios. Esto también supervisa y reinicia el script si se muere. Si quieres notificación si el corredor muere, puedes usar monit para hacerlo.

Aquí es mi guión corredor para demonios:

#!/usr/bin/env ruby 
require 'rubygems' 
require 'bundler' 
Bundler.require(:default) 
Bundler.setup(:default) 

options = { 
    :app_name => "log_eater", 
    :dir_mode => :system, 
    :multiple => true, 
    :backtrace => true, 
    :monitor => true 
} 

Daemons.run(File.join(File.dirname(__FILE__), 'log_eater.rb'), options) 

Esto ha estado funcionando durante muchos meses sin fugas o ningún problema. Dios tenía problemas con las filtraciones y la muerte. Capistrano puede reiniciar esto reiniciando su script de inicio.

Aquí es un extracto de la mina para Linux gentoo

start() { 
ebegin "Starting log-eater" 
    cd /ruby/STABLE/quickanalytics 
    `scripts/log_eater_runner.rb start -- /usr/logs/nginx.log` 
eend $? "Failed to start log-eater" 
} 

- después de que el comando de arranque es para cualquier argumentos que desea pasar a su guión.

+0

Gracias Michael! Voy a dar una oportunidad. – phil

0

En su caso, usaría Resque. Parece satisfacer tus requerimientos. Creo que viene con guiones de muestra para capistrano para controlar a los trabajadores. Monitorear a los trabajadores con god es un poco más complicado pero viene con una consola web para que pueda ver lo que sus trabajadores están haciendo. También hay un montón de complementos para satisfacer todas las necesidades que pueda tener.

https://github.com/defunkt/resque

Cuestiones relacionadas