停止 Ruby 服务的正确方法
Right way of stopping a Ruby service
我正在使用 AirBnb Nerve 服务。它的服务代码如下所示:
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
方法添加到 Nerve
以设置 $EXIT = true
。
- 修改
#run
,这样它就不会永远休眠 (sleep
),而是醒来并检查 $EXIT
。
我正在使用 AirBnb Nerve 服务。它的服务代码如下所示:
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
方法添加到Nerve
以设置$EXIT = true
。 - 修改
#run
,这样它就不会永远休眠 (sleep
),而是醒来并检查$EXIT
。