Ejecutar código una vez que el servidor Sinatra se está ejecutando

Tengo una aplicación Sinatra incluida en Sinatra::Base y me gustaría ejecutar un código una vez que el servidor haya comenzado, ¿cómo debo hacer para hacer esto?

Aquí hay un ejemplo:

 require 'sinatra' require 'launchy' class MyServer < Sinatra::Base get '/' do "My server" end # This is the bit I'm not sure how to do after_server_running do # Launches a browser with this webapp in it upon server start Launchy.open("http://#{settings.host}:#{settings.port}/") end end 

¿Algunas ideas?

Usar el bloque de configuración no es la forma correcta de hacer esto. Cada vez que cargue el archivo se ejecutarán los comandos.

Intenta extender run!

 require 'sinatra' require 'launchy' class MyServer < Sinatra::Base def self.run! Launchy.open("http://#{settings.host}:#{settings.port}/") super end get '/' do "My server" end end 

Así es como lo hago; básicamente ejecutando sinatra o el otro código en un hilo separado:

 require 'sinatra/base' Thread.new { sleep(1) until MyApp.settings.running? p "this code executes after Sinatra server is started" } class MyApp < Sinatra::Application # ... app code here ... # start the server if ruby file executed directly run! if app_file == $0 end 

Si está utilizando Rack (que probablemente esté usando), acabo de descubrir que hay una función a la que puede llamar en config.ru (técnicamente es un método de instancia de Rack::Builder ) que le permite ejecutar un bloque de código después de que el servidor haya sido iniciado Se llama warmup , y aquí está el ejemplo de uso documentado:

 warmup do |app| client = Rack::MockRequest.new(app) client.get('/') end use SomeMiddleware run MyApp 

La única respuesta válida en stackoverflow a esta pregunta (que se realiza de 3 a 4 veces) la da levinalex en Inicio y llama al servidor HTTP de Ruby en el mismo script , y cito:

run! en las versiones actuales de Sinatra toma un bloque que se llama cuando se inicia la aplicación.

Usando esa callback puedes hacer esto:

 require 'thread' def sinatra_run_wait(app, opts) queue = Queue.new thread = Thread.new do Thread.abort_on_exception = true app.run!(opts) do |server| queue.push("started") end end queue.pop # blocks until the run! callback runs end sinatra_run_wait(TestApp, :port => 3000, :server => 'webrick') 

Esto parece ser confiable para WEBrick, pero cuando se usa Thin, la callback todavía se llama un poco antes de que el servidor acepte conexiones.