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
ますか? それは理想的とは言えません... =/