0

我有以下封装 Rails 服务器进程的类:

require 'open3'

class RailsServer
  def self.start(port=3000)
    _, _, _, thread = Open3.popen3("rails", "server", "--port=#{port}")
    RailsServer.new(thread, port)
  end

  def initialize(thread, port)
    @thread = thread
    @port = port
  end

  def running?
    @thread.alive?
  end
end

到目前为止,一切都很好。不过现在,我想添加一个停止方法来优雅地停止服务器,让它有时间完成它正在做的事情,删除它的 pid 文件等。所以我这样做了:

require "timeout"

class RailsServer
  def stop(timeout=10)
    begin
      Timeout.timeout(timeout) do
        Process.kill("TERM", @thread.pid)
        sleep 1 while running?
      end
    rescue Timeout::Error
      Process.kill(9, @thread.pid)
    end
  end
end

不幸的是,在 Windows 上Process.kill("TERM", @thread.pid)引发错误。Errno::EINVAL: Invalid argument大概这是因为 Windows 不支持TERM? Process.kill(9, @thread.pid)工作得很好,但是(显然)没有给服务器时间来完成它正在做的事情并删除它的 pid 文件。

那么我该如何进行这项工作呢?我要发送一个CTRL+ CoverSTDIN吗?这听起来并不理想... =/

4

1 回答 1

0

我会这样做:`taskkill /PID #{@thread.pid}` 注意反引号,它只是在执行一个 windows 命令。

于 2013-08-12T17:05:54.363 回答