【问题标题】:Sinatra - terminate server from requestSinatra - 从请求中终止服务器
【发布时间】:2013-10-22 16:54:50
【问题描述】:

我希望能够从请求中终止 Sinatra 应用程序,例如使用以下路线:

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

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

有没有钩子可以做到这一点?

编辑:

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

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

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

【问题讨论】:

  • 根据您运行 sinatra 的机架服务器,您可以向它发送一些终止信号,例如 SIGKILL。这应该执行服务器的正常关闭。查看您的网络服务器的文档。
  • @phoet 查看我的扩展问题了解更多详情。如果您认为有办法选择特定的thin 服务器并将其发送给SIGKILLs,请作为答案提交。
  • 如果你想实现一个轻量级的测试替身,我认为最好通过简单的服务器套接字来实现。这样你就可以完全控制运行时行为和它应该接收的调用数量。也不是很难做到。
  • 测试替身已经编写好了,并且运行良好……使用 Sinatra 很容易。这是唯一悬而未决的问题。

标签: ruby sinatra thin


【解决方案1】:

这似乎归结为在发送响应之后运行代码的问题。不是一件容易的事:

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

看起来很“hacky”,但我质疑通过调用 URI 来远程关闭 Web 服务器的意义。 ;-)

【讨论】:

  • 在这种情况下,我不介意hacky...它是一个轻量级的测试服务器。明天我在办公室时会试试这个。为“我会回来的!”+1!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多