2013-09-25 3 views
3

Я хотел бы знать, как программно выйти из приложения Sinatra от в пределах самого приложения. (Есть еще одна нить о том, как остановить ее из-за пределов приложения.)Могу ли я остановить Sinatra из приложения Sinatra?

Я хочу использовать Sinatra как средство получения команд управления и конфигурации, в то время как мое приложение делает что-то, не связанное с материалом Sinatra. Я бы хотел, чтобы одна из команд управления была «exit». Метод «выхода» Ruby, похоже, приводит к восстановлению и возобновлению Sinatra. Я нашел это в base.rb, что я думаю, что это подтверждает:

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

До сих пор единственным способом я нашел это вызвать exit! метод Руби, но минует exit крючки и не очень чистое решение.

Невозможно ли программно сказать Синатре остановиться?

ответ

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 

Взгляните на at_exit в config.ru он работает для сигнала TERM:

at_exit do 
    puts 'Damn!' 
    exit false 
end 

Полный пример является here.

Cheers.

1

Этот вид идет против зерна Синатры, но это всего лишь Ruby, поэтому вы можете легко сделать это с помощью открытых классов/патчей обезьян.

Просто откройте метод base.rb at_exit и отмените поведение Application.run!.

1

Почему бы не просто создать исключение? Это будет означать, что $! не ноль, поэтому обработчик at_exit не перезапустит Sinatra.

Простой способ - просто запустить fail или raise. Вы также можете передать сообщение, например, fail "Exiting due to x".

Смежные вопросы