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+Cを送信しSTDINますか? それは理想的とは言えません... =/

4

1 に答える 1