我想知道如何以编程方式从在应用程序本身中退出Sinatra应用程序。 (还有一个关于在应用程序外停止它的SO线程。)
我希望使用Sinatra作为接收控制和配置命令的方法,而我的应用程序执行与Sinatra内容无关的操作。我希望其中一个控制命令是“退出”。 Ruby的'退出'方法似乎导致Sinatra恢复和恢复。我在base.rb中发现了这一点,我认为这证实了这一点:
at_exit { Application.run! if $!.nil? && Application.run? }
到目前为止,我发现的唯一方法是调用Ruby的exit!
方法,但绕过exit
挂钩并且不是一个非常干净的解决方案。
有没有办法以编程方式告诉Sinatra停止?
答案 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。
一种简单的方法就是运行fail
或raise
。您还可以传递消息,例如fail "Exiting due to x"
。