Detectar si la aplicación se inició como servidor HTTP o no (tarea de rake, rconsole, etc.)

Estoy usando EventMachine y Monetarily para iniciar el servidor e TCP junto con mi aplicación Rails. Esto se inicia desde config/initializers/momentarily.rb .

Mi problema es que se inicia también cuando ejecuto tareas de rake, como db:migrate . Solo quiero que se inicie cuando inicio el servidor HTTP. Los entornos no ayudarán, ya que tanto el inicio del servidor como las tareas de rake están en el entorno de desarrollo. ¿Hay alguna forma de saber que la aplicación ejecuta el servidor HTTP en lugar de cualquier otra cosa? Tenga en cuenta que no son solo tareas de rake, el EM también se inicia si ejecuto la consola de Rails, que de nuevo es algo que no es deseable para mi caso.

No hay una gran manera de hacer esto que yo sepa. Puede copiar el enfoque de newrelic (ver discover_dispatcher in local_environment.rb ) que básicamente tiene una lista de heurísticas utilizadas para detectar si se está ejecutando dentro del pasajero, delgado, etc.

Para pasajero se comprueba.

 defined?(::PhusionPassenger) 

por poco comprueba

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

Establezca una variable de entorno en el archivo config.ru y config.ru en cualquier parte del código para detectar si se ejecuta utilizando únicamente un comando del rails server .

Por ejemplo

  • Archivo: config.ru

     ENV['server_mode'] = '1' 

Y usándolo en alguna parte como:

  • Archivo: config/environment.rb

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

Referencia: Respuesta

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

Algo como:

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

No inicie ese otro servidor desde un inicializador. Cree un demonio en script/momentarily e inícielo desde su aplicación.

Después de que se inicie su aplicación, podría tener que pagarla para verificar ps . Si ps muestra que el servidor HTTP se está ejecutando y 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.

Intereting Posts