Sinatra перезапускает сервер Webrick после Ctrl-C

require 'sinatra'
require 'rubygems'

class TestServer < Sinatra::Application
set :port, 22340
    get '/' do
        "Hello World"
    end
    run! if app_file == $0
end

Очень простое приложение с Ruby 2.0.0-p0 и Sinatra 1.4.2

Когда я нажимаю ctrl-c, сервер webrick перезагружается на порт по умолчанию ... см. Вывод ниже

LM-BOS-00715009:server joshughes$ ruby test.rb 
[2013-04-19 16:07:48] INFO  WEBrick 1.3.1
[2013-04-19 16:07:48] INFO  ruby 2.0.0 (2013-02-24) [x86_64-darwin11.4.2]
== Sinatra/1.4.2 has taken the stage on 22340 for development with backup from WEBrick
[2013-04-19 16:07:48] INFO  WEBrick::HTTPServer#start: pid=63798 port=22340
^C
== Sinatra has ended his set (crowd applauds)
[2013-04-19 16:07:56] INFO  going to shutdown ...
[2013-04-19 16:07:56] INFO  WEBrick::HTTPServer#start done.
[2013-04-19 16:07:56] INFO  WEBrick 1.3.1
[2013-04-19 16:07:56] INFO  ruby 2.0.0 (2013-02-24) [x86_64-darwin11.4.2]
== Sinatra/1.4.2 has taken the stage on 4567 for development with backup from WEBrick
[2013-04-19 16:07:56] INFO  WEBrick::HTTPServer#start: pid=63798 port=4567
^C

Может ли кто-нибудь помочь мне в том, что здесь может быть не так?


person jjhughes57    schedule 19.04.2013    source источник


Ответы (1)


Проблема в том, что вы неправильно используете модульный стиль Sinatra. Вместо того, чтобы требовать sinatra и наследовать от Sinatra::Application, вы должны требовать sinatra/base и наследовать от Sinatra::Base.

Что происходит? Вам нужен простой sinatra, который, в свою очередь, требует sinatra/main. Этот файл добавляет обработчик at_exit, запускающий встроенный сервер (если вы не отключите его). Однако вы также явно вызываете run! в своем собственном коде, поэтому сервер запускается из-за вашего вызова, а затем, когда вы выходите, обработчик at_exit снова запускает сервер. Требование sinatra/base не приводит к запуску встроенного сервера при выходе, поэтому у вас будет только собственный явный вызов run!.

require 'sinatra/base' # change here
require 'rubygems'

class TestServer < Sinatra::Base # and here
  set :port, 22340
  get '/' do
    "Hello World"
  end
  run! if app_file == $0
end
person matt    schedule 19.04.2013