2011-03-26 18 views
14

Estoy intentando crear un daemon personalizado que cargue el entorno de Rails. Mi entorno es el siguiente: rubí-1.9.2-p180 carriles 3.0.5Daemon personalizado con Rails 3

hice lo siguiente:

abierto instalado el daemon joya

abierto instalado el plugin daemon_generator encontrar aquí: https://github.com/dougal/daemon_generator

-Generated un demonio: demonio de rieles generan oyente

Todo esto funcionaba bien. Cuando ejecuto el daemon, funciona.

Sin embargo, tan pronto como intento acceder a un objeto de registro activo como intentar recuperar un usuario, explota.

*** below you find the most recent exception thrown, this will be likely (but not certainly) the exception that made the application exit abnormally *** 
#<NameError: method `recognize' not defined in Rack::Mount::RouteSet> 
*** below you find all exception objects found in memory, some of them may have been thrown in your application, others may just be in memory because they are standard exceptions *** 
#<NoMemoryError: failed to allocate memory> 
#<SystemStackError: stack level too deep> 
#<fatal: exception reentered> 
#<NoMethodError: undefined method `eq' for nil:NilClass> 
#<NameError: method `recognize' not defined in Rack::Mount::RouteSet> 

Alguna idea sobre cómo crear un demonio que carga hasta Rails 3.0.5?

+0

Estoy teniendo el mismo error aquí. Ni siquiera puedo ejecutar al daemon como está. Estoy usando ree-1.8.7-2011.03. Lamento no haber sido de ayuda. – Jaryl

+0

Estoy obteniendo el mismo error usando rvm ruby-1.9.2-p136 y rieles 3.0.7. ¿Encontraste alguna solución? –

Respuesta

16

prefiero rodar los propios raíles controladores demonio. Aquí está un ejemplo simple que funciona para la mayoría de los casos:

script/daemon

#!/usr/bin/env ruby 
require 'rubygems' 
require 'daemons' 

ENV["APP_ROOT"] ||= File.expand_path("#{File.dirname(__FILE__)}/..") 
ENV["RAILS_ENV_PATH"] ||= "#{ENV["APP_ROOT"]}/config/environment.rb" 

script = "#{ENV["APP_ROOT"]}/daemons/#{ARGV[1]}" 

Daemons.run(script, dir_mode: :normal, dir: "#{ENV["APP_ROOT"]}/tmp/pids") 

demonios/your_daemon_script.rb

require ENV["RAILS_ENV_PATH"] 
loop { 
    ... your code ... 
} 

Usted puede controlar sus deamons mediante el uso de los siguientes comandos:

script/daemon run your_daemon_script.rb 
script/daemon start your_daemon_script.rb 
script/daemon stop your_daemon_script.rb 

Esto me permite agregar nuevos daemons fácilmente y puedo cargar fácilmente ra ils en cada script si es necesario.

+0

¿Por qué rubygems es un requisito? –

1

Mirando el código en https://github.com/dougal/daemon_generator/blob/master/lib/generators/daemon/templates/script.rb parece que se carguen las cosas en el orden equivocado ...

En cuanto a mi guión delayed_job demonio y config.ru cargan config/environment.rb (que a su vez en las cargas de aplicación. rb e inicializa la aplicación)

Así que una posible solución sería la de modificar el script generado y hacer que sólo requieren 'config/environment.rb'

he intentado esto:

#!/usr/bin/env ruby 

# You might want to change this 
ENV["RAILS_ENV"] ||= "development" 

require File.dirname(__FILE__) + "/../config/environment" 

$running = true 
Signal.trap("TERM") do 
    $running = false 
end 

while($running) do 

    # Replace this with your code 
    Rails.logger.auto_flushing = true 
    o = Order.last 
    Rails.logger.info "The latest order is #{o.id}" 

    sleep 10 
end 

y no dio errores ... (probamos tanto Rails 3.0.3 y 3.0.5)

+0

Interesante, ¿qué versión de Ruby tenías? Intenté esto exactamente y obtuve el error del cartel original usando rvm ruby-1.9.2-p136 y rieles 3.0.7 –

0

que tenían problemas para ejecutar el demonio al igual que en mi servidor de ensayo (Rails 3.0.7, 1.8.7 rubí, pasajero 3.0.0). Ni

requieren File.dirname (ARCHIVO) + "/../../config/application" Rails.application.require_environment!

ni

requieren File.dirname (ARCHIVO) + "/../config/environment"

trabajadas.

Lo arreglé reinstalando el config.ru estándar en rails root (que había desinstalado para integrar w passenger ... no estoy seguro de cómo conseguiré daemons & pasajero para trabajar juntos ahora ...)

1

Tuve muchos problemas intentando que daemon_generator funcionara. Hice funcionar a mi daemon omitiendo el daemon_generator y usando la gema daemons (v1.1.3).

en urserver_control.rb (en el directorio de aplicación rubí raíz):

 
    #!/usr/bin/env ruby 
    require 'rubygems' 
    require 'daemons' 
    require 'TweetMsg' 

    Daemons.run('urserver.rb') 

en urserver.RB:

 
#!/usr/bin/env ruby 
require File.expand_path(File.join(File.dirname(__FILE__), 'config', 'environmen 
t')) 
require "rubygems" 

    --- insert your code here --- 

Usted puede probar mediante la ejecución de su servidor directamente o ruby urserver.rbruby urserver_controller run Y luego, una vez que está trabajando iniciar y detener el controlador ruby urserver_control.rb {start | stop | run }

+0

esto es lo que hice también – ckarbass