2012-08-23 16 views
9

Estoy usando EventMachine y Monetarily para iniciar el servidor TCP junto con la aplicación my rails. Esto se inicia desde config/initializers/momentarily.rb.Detectar si la aplicación se inició como servidor HTTP o no (tarea de rake, rconsole, etc.)

Mi problema es que también se inicia cuando ejecuto tareas de rake, como db:migrate. Solo quiero que comience cuando empiece el servidor HTTP. Los entornos no serán de ayuda, ya que tanto las tareas de inicio del servidor como las de rastreos se encuentran en el entorno Desarrollo. ¿Hay alguna manera de saber que la aplicación está ejecutando el servidor HTTP en lugar de cualquier otra cosa? Tenga en cuenta que no solo se trata de tareas de rake, el EM también se inicia si ejecuto la consola Rails, que de nuevo es algo no deseable para mi caso.

Respuesta

6

No hay una gran manera de hacer esto que yo sepa. Se podría copiar enfoque newrelic 's (marque discover_dispatcher en local_environment.rb) que básicamente tiene una lista de heurística utilizado para detectar si se está ejecutando dentro de pasajeros, delgada, etc.

Para pasajeros comprueba

defined?(::PhusionPassenger) 

de delgada comprueba

if defined?(::Thin) && defined?(::Thin::Server) 
+0

Eso es realmente prometedor. ¡Gracias! –

+0

Esto no parece funcionar para mí en Rails 4 con pasajero. –

+0

La constante para comprobar parece ser :: PhusionPassenger ahora –

0

Tal vez pueda implementar un interruptor en el inicializador basado en ARGV?

Algo así como:

if ARGV.join(' ').match /something/ 
    # your initializer code here 
end 
+0

tendría que trabajar en la producción también, cuando se ejecuta en Apache –

0

No empiece a ese otro servidor desde un inicializador. Crea un daemon en script/momentarily y comienza desde tu aplicación.

+0

yo todavía necesitan saber cuándo iniciar el demonio y cuándo no –

0

Después de que se inicia su aplicación, puede hacer que se borre para verificar ps. Si ps muestra que el servidor HTTP se está ejecutando y que el servidor HTTP en ejecución tiene el mismo pid que su aplicación (verifique el pid inspeccionando $$), entonces podría iniciar el servidor TCP.

+0

Pero esta voluntad no funciona cuando ejecuto 'rails server'. –

+0

Sí lo hará. Cuando ejecuta los raíles del servidor 'ps aux | grep rails' contendrá algo así como 'remus 18454 0.0 0.8 2515572 65968 s000 S + 11:10 AM 0: 01.51 /Users/remus/.rvm/rubies/ruby-1.9.3-p125/bin/ruby script/rails server' –

6
unless File.basename($0) == "rake" && ARGV.include?("db:migrate") 
    # you are not in rake db:migrate 
end 
+0

más limpio de lo sucio. ¡Gracias! –

3

establecer una variable de entorno en el archivo config.ru, y usarlo en cualquier parte del código para detectar si se ejecuta utilizando solamente un comando rails server.

Por ej.

  • del archivo:config.ru

    ENV['server_mode'] = '1' 
    

Y su uso en algún lugar como:

  • del archivo:config/environment.rb

    Thread.new { infinite_loop! }.join if ENV['server_mode'] = '1' 
    

Referencia: Answer

Cuestiones relacionadas