我有以下封装 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
吗?这听起来并不理想... =/