停止分布式Ruby服务

时间:2011-03-28 14:52:10

标签: ruby distributed ruby-1.9 ruby-1.8 drb

我有一个启动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 个答案:

答案 0 :(得分:6)

好的,我想我找到了解决方案。如果我用

替换原始代码
begin
  DRb.thread.join
rescue Interrupt
ensure
  DRb.stop_service
end

Ctrl-C可以工作并停止服务。

答案 1 :(得分: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。 同时捕获信号是首选方法,而不是挽救中断异常。