2013-09-25 42 views
3

我想知道如何以編程方式從退出Sinatra應用程序的應用程序本身。 (還有另一個關於從應用程序外部阻止它的SO線程。)我可以在Sinatra應用程序中停止Sinatra嗎?

我想使用Sinatra作爲接收控制和配置命令的手段,而我的應用程序執行與Sinatra無關的操作。我希望其中一個控制命令是「退出」。 Ruby的'退出'方法似乎導致Sinatra恢復和恢復。我發現這個在base.rb,我認爲證實了這一點:

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

到目前爲止,我發現的唯一方法是調用Ruby的exit!方法,但繞過exit掛鉤,而不是一個非常乾淨的解決方案。

難道沒有辦法以編程方式告訴Sinatra停止嗎?

回答

1

我用下面的代碼:

# 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.ruat_exit看看它的工作原理爲TERM信號:

at_exit do 
    puts 'Damn!' 
    exit false 
end 

完整的例子就是here

乾杯。

1

這種情況違背了Sinatra的粒度,但這只是Ruby,所以你可以通過開放的課程/猴子補丁輕鬆地做到這一點。

只需重新打開base.rb at_exit方法並覆蓋Application.run!行爲。

1

爲什麼不只是引發異常?這意味着$!不是零,所以at_exit處理程序不會重新啓動Sinatra。

一個簡單的方法是運行failraise。您也可以傳遞消息,如fail "Exiting due to x"