停止Ruby服务的正确方法

停止Ruby服务的正确方法,ruby,service,Ruby,Service,我正在使用AirBnb神经服务。其服务代码如下所示: require 'logger' require 'json' require 'timeout' require 'nerve/version' require 'nerve/utils' require 'nerve/log' require 'nerve/ring_buffer' require 'nerve/reporter' require 'nerve/service_watcher' module Nerve clas

我正在使用AirBnb神经服务。其服务代码如下所示:


require 'logger'
require 'json'
require 'timeout'

require 'nerve/version'
require 'nerve/utils'
require 'nerve/log'
require 'nerve/ring_buffer'
require 'nerve/reporter'
require 'nerve/service_watcher'

module Nerve
  class Nerve

    include Logging

    def initialize(opts={})
      log.info 'nerve: starting up!'

      # set global variable for exit signal
      $EXIT = false

      ...some code...

      # Any exceptions in the watcher threads should wake the main thread so
      # that we can fail fast.
      Thread.abort_on_exception = true

      log.debug 'nerve: completed init'
    end

    def run
      log.info 'nerve: starting run'

      @services.each do |name, config|
        launch_watcher(name, config)
      end

      begin
        sleep
      rescue StandardError => e
        log.error "nerve: encountered unexpected exception #{e.inspect} in main thread"
        raise e
      ensure
        $EXIT = true
        log.warn 'nerve: reaping all watchers'
        @watchers.each do |name, watcher_thread|
          reap_watcher(name)
        end
      end

      log.info 'nerve: exiting'
    ensure
      $EXIT = true
    end

    def launch_watcher(name, config)
... some code ...
    end

    def reap_watcher(name)
... some code ...
    end
  end
end

我没有看到任何停止方法。停止这种服务的正确方法是什么?我正在使用JRuby,并打算为此服务编写一个JSVC适配器。

除了向它发送一个信号之外,通过当前的API无法做到这一点

如果发送信号不起作用,并且您希望显式处理stop,则您需要更改以下内容:

向设置$EXIT=true的Nerve添加一个stop方法。 修改run,使其唤醒并检查$EXIT,而不是永远睡眠。
谢谢信号工作。我为这个服务编写了一个JSVC适配器。JSVC正在通过发送信号关闭此服务。但是,不确定这是否干净。