我可以在Sinatra应用程序中停止Sinatra吗?

时间:2013-09-25 14:18:41

标签: ruby sinatra exit

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

我使用了以下代码:

# 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

查看config.ru中的at_exit,它适用于TERM信号:

at_exit do
  puts 'Damn!'
  exit false
end

完整的示例是here

干杯。

答案 1 :(得分:1)

这种情况违背了Sinatra,但这只是Ruby,所以你可以通过开放的类/猴子修补轻松完成。

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

答案 2 :(得分:1)

为什么不提出例外?这意味着$!不是零,因此at_exit处理程序不会重启Sinatra。

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