Остановка распределенной службы Ruby

У меня есть сценарий, который запускает службу DRb, до порождения объекта обработчика и ожидания через DRb.thread.join, Я бы хотел, чтобы скрипт запускался до тех пор, пока он не будет уничтожен, поэтому я добавил

trap "INT" do
  DRb.stop_service
end

которая успешно останавливает службу DRb и выходит из-под Ruby 1.8, но под 1.9 кажется тупиковой (на OS X 10.6.7). Выборка процесса показывает пару потоков, вращающихся в semaphore_wait_signal_trap,

Я предполагаю, что я делаю что-то не так, как я звоню stop_serviceно я не уверен что. Может ли кто-нибудь дать мне какие-либо советы о том, как правильно сделать это?

2 ответа

Решение

Хорошо, я думаю, что нашел решение. Если я заменю оригинальный код

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

Ctrl-C работает и останавливает службу.

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 в этом случае. Также перехват сигнала является предпочтительным способом вместо спасения исключения прерывания.

Другие вопросы по тегам