3

我想知道如何从应用程序本身以编程方式退出 Sinatra 应用程序。(还有另一个关于从应用程序外部停止它的 SO 线程。)

我想使用 Sinatra 作为接收控制和配置命令的一种方式,而我的应用程序执行与 Sinatra 无关的事情。我希望控制命令之一是“退出”。Ruby 的“退出”方法似乎只是导致 Sinatra 恢复和恢复。我在 base.rb 中发现了这一点,我认为这证实了这一点:

at_exit { Application.run! if $!.nil? && Application.run? }

到目前为止,我发现的唯一方法是调用 Ruby 的exit!方法,但这绕过exit了钩子并且不是一个非常干净的解决方案。

有没有办法以编程方式告诉 Sinatra 停止?

4

4 回答 4

3

我使用了以下代码:

# Exit 'correctly'
get '/exit' do
  # /exit causes:
  # 15:20:24 web.1  | Damn!
  # 15:20:24 web.1  | exited with code 1
  Process.kill('TERM', Process.pid)
end

# Just terminate
get '/fail' do
  Process.kill('KILL', Process.pid)
end

at_exitconfig.ru中查看它适用于 TERM 信号:

at_exit do
  puts 'Damn!'
  exit false
end

完整的例子在这里

干杯。

于 2015-10-09T08:10:32.330 回答
1

这与 Sinatra 的风格背道而驰,但这只是 Ruby,因此您可以通过开放类/猴子补丁轻松地做到这一点。

只需重新打开 base.rbat_exit方法并覆盖该Application.run!行为。

于 2013-09-25T14:56:05.540 回答
1

为什么不直接引发异常?这将意味着它$!不是 nil,因此at_exit处理程序不会重新启动 Sinatra。

一个简单的方法就是运行failraise. 您还可以传递消息,例如fail "Exiting due to x".

于 2015-10-09T08:15:52.743 回答
1

Sinatra::Base::quit!或者它的别名::stop!就是你要找的:

require 'sinatra'

get '/quit' do
  self.class.quit!
end

get '/stop' do
  self.class.stop!
end
于 2021-09-09T18:38:18.873 回答