Остановка распределенной службы Ruby - PullRequest
6 голосов
/ 28 марта 2011

У меня есть скрипт, который запускает службу 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 ]

6 голосов
/ 18 июня 2011

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

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

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

0 голосов
/ 29 апреля 2012

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

...