2011-06-23 17 views
5

bundle exec thin start -p 3111 da el siguiente resultado:Delgado no responde a SIGINT o SIGTERM

Con un adaptador de estante Thin servidor web (nombre en clave v1.2.11 Palo-Mierda loco) conexiones máximo establecido en 1024 escucha en 0.0.0.0:3111, CTRL + C para detener ^ C

Ctrl-C no hace nada (SIGINT). Tampoco mata (SIGTERM).

He encontrado algunas referencias a este comportamiento, pero no hay soluciones. El problema parece ser en eventmachine (incluido en el último thin), en ruby ​​1.9.2-r290, o en el kernel de Linux (Ubuntu 10.4 LTS, 2.6.38.3-linode32).

Sucede con mi proyecto, pero no con un nuevo proyecto de rieles.

Referencias:

+0

¿Puede proporcionar sus archivos de configuración delgados y de tapa por favor? – Anatoly

+0

Pruebe 'ctrl + Z' y luego' Enter'? – Zabba

+0

También podría probar la poco conocida Ctrl- \ que a veces funciona de maravilla. –

Respuesta

5

Mi conjetura es que sea algo está atando el circuito del reactor EventMachine evitando que salga, o algo está atrapando SIGINT.

Como un simple ejemplo de lo primero, poner esto en config.ru y correr con thin -p 4567 start:

require 'thin' 
require 'sinatra' 
require 'eventmachine' 


get '/' do 
    "hello world" 
end 

run Sinatra::Application 

EventMachine.schedule do 
    trap("INT") do 
    puts "Caught SIGINT" 
    EventMachine.stop # this is useless 
    # exit # this stops the EventMachine 
    end 

    i = 0 
    while i < 10 
    puts "EM Running" 
    i += 1 
    sleep 1 
    end 
end 

sin atrapar la SIGINT, se obtiene el mismo comportamiento que cuando atrapándola y llamando EM.stop. EM.stop (al menos en la versión de ruby ​​puro, que se puede ejecutar con EVENTMACHINE_LIBRARY="pure_ruby" thin start) establece un indicador de que se ha solicitado una detención, que se recoge dentro del bucle del reactor. Si el bucle del reactor está atascado en un escalón (como en el caso anterior), entonces no saldrá.

Así que un par de opciones:

  1. utilizar la solución anterior de atrapar SIGINT y forzar una salida. Esto podría dejar las conexiones en un estado impuro, pero no llamarlo rápida & sucia por nada;)

  2. que podría poner el código de bloqueo en el interior de un hilo o una fibra, lo que permitirá el reactor para mantener corriendo.

  3. busque tareas o bucles de larga ejecución dentro de su código, y conviértalos para que sean compatibles con EventMachine. em-http-request es una gran biblioteca para solicitudes http externas, y em-synchrony tiene muchos otros protocolos (para conexiones de bases de datos, grupos de conexiones tcp, etc.). En el ejemplo anterior, esto es sencillo: EventMachine.add_periodic_timer(1) { puts "EM Running" }

en su código real, esto podría ser más difícil de localizar, pero buscar los lugares donde desovan las discusiones y unirse a ellos, o grandes bucles. Una herramienta de creación de perfiles puede ayudar a mostrar qué código se está ejecutando cuando intentas salir, y por último puedes intentar deshabilitar varias partes del sistema y las bibliotecas para descubrir dónde está el culpable.

+0

Gracias por su respuesta detallada. Con suerte, esto me dará pistas suficientes para resolver el problema. –