2011-03-28 4 views
6

핸들러 객체를 생성하고 DRb.thread.join을 통해 대기하기 전에 DRb 서비스를 시작하는 스크립트가 있습니다. 나는 명시 적으로 살해 할 때까지 실행하는 스크립트를 원하는, 그래서 나는분산 루비 서비스 중지

성공적으로 루비 1.8에서 DRB 서비스와 종료를 중지
trap "INT" do 
    DRb.stop_service 
end 

하지만 (OS X 10.6.7에) 교착 것 1.9에서 추가되었습니다. 프로세스를 샘플링하면 두 개의 스레드가 semaphore_wait_signal_trap으로 회전합니다.

나는 내가 전화하고있는 방식으로 뭔가 잘못하고 있다고 가정합니다. stop_service, 그러나 나는 무엇을 확신하지 못합니다. 아무도 그것에 대해 올바르게가는 방법에 대한 모든 포인터를 내게 줄 수 있습니까?

답변

6

좋아요, 해결책을 찾은 것 같습니다. 원래 코드를

으로 바꾼 경우
begin 
    DRb.thread.join 
rescue Interrupt 
ensure 
    DRb.stop_service 
end 

Ctrl-C는 서비스를 작동하고 중지합니다.

0

DRb.thread.join은 호출 스레드가 DRb 실행 스레드가 끝날 때까지 기다리게합니다. INT 신호를 잡으려면 다음 코드를 대신 사용하십시오.

$execute = true 
DRb.start_service 

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

이 경우에는 DRb.thread.join가 없습니다. 또한 신호를 잡는 것이 인터럽트 예외를 해결하는 대신에 선호되는 방법입니다.