2013-10-10 5 views
1

Я создаю приложение Ruby, которое запускает сервер EM :: WebSocket, а также сервер Sinatra. Я считаю, что оба они оснащены для обработки SIGINT. Однако при запуске в одном приложении приложение продолжает, когда я нажимаю Ctrl + C. Мое предположение состоит в том, что один из них захватывает SIGINT, не позволяя другому захватить его. Я не уверен, как это сделать.Ctrl + C не убивает Sinatra + EM :: Серверы WebSocket

Вот код в двух словах:

require 'thin' 
require 'sinatra/base' 
require 'em-websocket' 

EventMachine.run do 
    class Web::Server < Sinatra::Base 
    get('/') { erb :index } 
    run!(port: 3000) 
    end 

    EM::WebSocket.start(port: 3001) do |ws| 
    # connect/disconnect handlers 
    end 
end 
+0

Является ли это какой-либо помощи? http://stackoverflow.com/questions/6456912/thin-doesnt-respond-to-sigint-or-sigterm –

+0

Спасибо за обмен. Я попробовал несколько вариантов захвата INT и TERM на основе этого вопроса/принятого ответа SO, но ничто, похоже, не работает для меня. –

ответ

0

Я понижаем тонкий до версии 1.5.1, и он просто работает. Проводной доступ.

1

У меня была та же проблема. Ключ для меня, казалось бы начать Thin в контуре реактора с signals: false:

Thin::Server.start(
    App, '0.0.0.0', 3000, 
    signals: false 
) 

Это полный код для простого сервера чата:

require 'thin' 
require 'sinatra/base' 
require 'em-websocket' 

class App < Sinatra::Base 
    # threaded - False: Will take requests on the reactor thread 
    #   True: Will queue request for background thread 
    configure do 
    set :threaded, false 
    end 

    get '/' do 
    erb :index 
    end 
end 


EventMachine.run do 

    # hit Control + C to stop 
    Signal.trap("INT") { 
    puts "Shutting down" 
    EventMachine.stop 
    } 

    Signal.trap("TERM") { 
    puts "Shutting down" 
    EventMachine.stop 
    } 

    @clients = [] 

    EM::WebSocket.start(:host => '0.0.0.0', :port => '3001') do |ws| 
    ws.onopen do |handshake| 
     @clients << ws 
     ws.send "Connected to #{handshake.path}." 
    end 

    ws.onclose do 
     ws.send "Closed." 
     @clients.delete ws 
    end 

    ws.onmessage do |msg| 
     puts "Received message: #{msg}" 
     @clients.each do |socket| 
     socket.send msg 
     end 
    end 


    end 

    Thin::Server.start(
    App, '0.0.0.0', 3000, 
    signals: false 
) 

end