2013-10-22 51 views
3

我希望能够根据请求终止Sinatra应用,例如,用以下路线:Sinatra - 通过请求终止服务器

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

像这样实现它有点突然。我宁愿完成请求,返回HTTP OK消息,然后Sinatra优雅地关闭。

有没有这样做的钩子?

编辑:

我的应用程序是用于接收网络挂接通知一个轻量级的模拟服务器。我将在同一台计算机上使用多个服务器(不同端口),因此需要避免任何全局启动/停止方法。

我的要求是由于每个服务器都必须运行在自己的Ruby实例中,因此我的测试与服务器之间除了通过REST接口之外没有任何通信。

我使用默认的thin服务器来运行Sinatra。到目前为止,我的代码只是Sinatra :: Base的一个子类,从代码中开始使用run!。这很好,很简单,我可以让独立脚本实例化每个服务器,我只需要有一种方法来阻止它们。

+0

取决于您正在运行sinatra的机架服务器,您可以发送一些终止信号,如'SIGKILL'。这应该会正常关闭服务器。看看你的Web服务器的文档。 – phoet

+0

@phoet查看我的扩展问题了解更多详情。如果您认为有一种方法可以选择特定的瘦服务器并将它们发送给SIGKILL,请将其作为答案提交。 – Stefan

+0

如果你想实现一个轻量级的测试加倍,我认为最好通过简单的服务器套接字来做到这一点。这样你就可以完全控制运行时行为和它应该接收的调用次数。这两者都不是很难。 – phoet

回答

2

这似乎是发送响应后运行代码的问题。并不是一件很容易的事:

What's the fastest way for a true sinatra(ruby/rack) after_filter?

这就是说,它看起来像你可以做这样的事情(虽然我没有测试过):

post '/terminate' do 
    body "I'll be back..." 
    # maybe clean things up here... 
    logger.info "Received terminate request!" 
    Thread.new { sleep 1; Process.kill 'INT', Process.pid } 
    halt 200 
end 

似乎很“哈克”,但是我质疑能够通过对URI的调用来远程关闭Web服务器。 ;-)

+0

在这种情况下,我不介意哈克...这是一个轻量级的测试服务器。明天我在办公室时会试试这个。 '我会回来的!'+1! – Stefan