2009-04-07 18 views
6

Ok, me gustaría crear una acción en Rails para reiniciarlo. Hice un poco de búsqueda y encontró:¿Cómo reiniciar los raíles desde Rails?

http://snippets.dzone.com/posts/show/5002

Lo que sugiere 2 comandos, uno para detener y otro para reiniciar. Los siguientes muertes:

ps -a|grep "/usr/local/bin/ruby script/server"|grep -v "grep /usr"|cut -d " " -f1|xargs -n 1 kill -KILL $1 

La señal HUP no se reinicia para mí, así que trató de destrozar el comando anterior (ajustado para que el comando funcionó bien con la forma en que estaba empezando el servidor bajo Ubuntu):

ps -eaf|grep "ruby script/server"|grep -v grep|cut -d " " -f3|xargs -n 1 kill -KILL $1;script/server 

Esto funciona bien en mi entorno, por lo que trató de establecer una acción para ejecutarlo:

def restart 
    fork { exec "ps -eaf|grep \"ruby script/server\"|grep -v grep|cut -d \" \" -f3|xargs -n 1 kill -KILL $1;script/server" } 
    redirect_to "/server_maintenance" 
end 

la acción mata a la multa del servidor, pero en realidad no se inicia el servidor de servicios u P:

=> Booting Mongrel 
=> Rails 2.3.2 application starting on http://0.0.0.0:3000 
=> Call with -d to detach 
=> Ctrl-C to shutdown server 
Exiting 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/tcphack.rb:12:in `initialize_without_backlog': Address already in use - bind(2) (Errno::EADDRINUSE) 
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/tcphack.rb:12:in `initialize' 
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:93:in `new' 
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:93:in `initialize' 
    from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb:10:in `new' 
    from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb:10:in `run' 
    from /usr/lib/ruby/gems/1.8/gems/rails-2.3.2/lib/commands/server.rb:111 
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' 
    from script/server:3 

No me entiendo muy bien la dirección ya está en uso cuando Mestizo parece haber salido solo.

me encontré con esta pregunta:

How do you restart Rails under Mongrel, without stopping and starting Mongrel

pero las señales no causan el reinicio en mi entorno, que acaba de terminar matando el proceso.

¿Alguien tiene alguna idea sobre lo que puede funcionar? Para algunas notas sobre mi entorno: instalé Rails de una nueva versión de RubyGems y Mongrel. Utilizo script/server para iniciar el servidor, que por supuesto usa Mongrel. Estoy en Ubuntu Hardy Heron.

Respuesta

3

Ok he encontrado una solución ... He cambiado cómo empezar a rieles:

mongrel_rails start -d 

y ahora la siguiente acción lo hará:

def restart 
    fork { exec "mongrel_rails restart" } 
    redirect_to "/server_maintenance" 
end 

A modo de advertencia, la voluntad redirect_to causa una carga fallida porque el servidor estará inactivo ... sin embargo, una recarga después de una pausa mostrará que el reinicio fue exitoso. Esto podría solucionarse cambiando el reinicio que se realizará con AJAX, seguido de una recarga de JavaScript ... pero lo dejaré como un ejercicio para el lector.

4

Si no le importa cambiar a mod_rails, puede reiniciar su servidor creando $ RAILS_ROOT/tmp/restart.txt, lo que provoca que solo la instancia de Rails que desea reiniciar.

Su comando PS se ve (mirada cursoraria) como si matara todos los procesos de los rieles en su caja. Eso está bien si eres la única aplicación de Rails en una máquina, pero si hay unos pocos ejecutándose como el mismo usuario o si estás ejecutando como root, los matarás a todos. ¡Mala forma!

This lo señala por mongrel. Hay la forma en que quieres probar.

+0

Gracias por la respuesta! De hecho lo hice funcionar un poco antes de que respondieras, pero el enlace muestra más o menos cómo lo hice funcionar, ¡así que votaré! –

0

En nuestra consulta con las startups que ejecutan sus sitios en Rails, utilizamos dos métodos para gestionar los procesos de mongrel.

Primero, es una joya personalizada que escribimos llamada mongrel_runit. Esto establece mestizos como servicios en runit.

En segundo lugar, utilizamos god para controlar los procesos de mongrel. Esto funcionará con mongrel_runit, o con configuraciones mongrel 'normales'.

+0

¡Gracias por la respuesta! Lamentablemente, esto no cumple exactamente con mis necesidades personales. También le sugiero que agregue más información sobre mongrel_runit aquí y en la página del proyecto ... no está del todo claro qué hace. –

Cuestiones relacionadas