为什么我不能使用以下内容停止Sinatra服务器:
post '/terminate' do
Thread.current.kill
end
我输入我的浏览器:
localhost:<port>/terminate
但它永远不会终止服务器,Sinatra说它不知道这样的路径。可能是什么原因?
答案 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,就像其他人一样 。停止像这样的网络服务器可能有一些很好的理由,但我想不到一个,也许不同的服务器会对线程杀死和退出等做出不同的反应,但它们仍然不会停止你的服务器。
顺其自然。