为什么我不能终止Sinatra服务器?

时间:2015-07-27 19:21:06

标签: ruby sinatra

为什么我不能使用以下内容停止Sinatra服务器:

post '/terminate' do
  Thread.current.kill
end

我输入我的浏览器:

localhost:<port>/terminate

但它永远不会终止服务器,Sinatra说它不知道这样的路径。可能是什么原因?

2 个答案:

答案 0 :(得分:2)

浏览器将执行“GET”http请求。

如果您更改为

get '/terminate' do
  exit # system exit!
end

我认为它会奏效。

答案 1 :(得分:1)

adzdavies部分正确,您没有点击路线,因为您的浏览器发出GET请求并且您已定义了post路由,但exit无效或者,它只会向你吐出一个错误。同样会引发Interrupt例外。 Thread.current.kill只是结束当前线程的执行,这似乎意味着杀死当前实例和服务器will just spawn a new instance on the next request,它不会杀死服务器,服务器有自己的进程。

require 'sinatra/base'

class SillyWaysToKillTheServer < Sinatra::Base

  enable :inline_templates

  get "/" do
    erb :index
  end

  get '/terminate' do
    exit # system exit!
  end

  get "/threadkill" do
    Thread.current.kill
  end

  get "/exception" do
    raise Interrupt, "Kill the server, please!"
  end

  run! if __FILE__ == $0
end

__END__

@@ layout
<html>
<body>
  <%= yield %>
</body>
</html>

@@ index

<p><a href="/terminate">terminate</a></p>
<p><a href="/threadkill">threadkill</a></p>
<p><a href="/exception">exception</a></p>

Sinatra是一个框架,而不是服务器。服务器有自己的进程并运行一个启动新线程或分支的小循环(Thin使用线程作为其模型,例如Unicorn使用preforking)或运行您提供的Sinatra代码的任何东西。要停止服务器,请使用Ctrl + c中断它,或者找到进程号并使用kill或通过发送一个SIGHUP,就像其他人一样 。停止像这样的网络服务器可能有一些很好的理由,但我想不到一个,也许不同的服务器会对线程杀死和退出等做出不同的反应,但它们仍然不会停止你的服务器。

顺其自然。