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