2011-03-28 13 views
6

Tengo un script que inicia un servicio de DRb, antes de generar un objeto de controlador y espera a través del DRb.thread.join. Me gustaría que la secuencia de comandos para ejecutar hasta que murieron de forma explícita, por lo que añadeDetención de un servicio de Ruby distribuido

trap "INT" do 
    DRb.stop_service 
end 

que se detiene con éxito el servicio DRb y salidas en virtud de Ruby 1.8, pero bajo 1.9 parece a un punto muerto (en OS X 10.6.7). El muestreo del proceso muestra un par de hilos girando en semaphore_wait_signal_trap.

Supongo que estoy haciendo algo mal en la forma en que llamo al stop_service, pero no estoy seguro de qué. ¿Alguien podría darme algún consejo sobre cómo hacerlo correctamente?

Respuesta

6

De acuerdo, creo que he encontrado la solución. Si sustituyo el código original con

begin 
    DRb.thread.join 
rescue Interrupt 
ensure 
    DRb.stop_service 
end 

El Ctrl-C funciona y se detiene el servicio.

0

DRb.thread.join hace que el hilo de llamada espere a que termine el subproceso de ejecución de DRb. Si desea capturar la señal INT, prefiero usar el siguiente código.

$execute = true 
DRb.start_service 

Signal.trap("INT") { $execute = false } 
while $execute 
    sleep 1 
end 
DRb.stop_service 

Tenga en cuenta que no hay DRb.thread.join en este caso. También capturar la señal es la forma preferida en lugar de rescatar la excepción de Interrupción.

Cuestiones relacionadas