My przypuszczenie, że albo coś jest wiązanie się z pętli reaktora EventMachine zapobiegając wydostawaniu lub coś się zatrzymując SIGINT.
Jako prosty przykład tego pierwszego, umieścić to w config.ru
i biegać z thin -p 4567 start
:
require 'thin'
require 'sinatra'
require 'eventmachine'
get '/' do
"hello world"
end
run Sinatra::Application
EventMachine.schedule do
trap("INT") do
puts "Caught SIGINT"
EventMachine.stop # this is useless
# exit # this stops the EventMachine
end
i = 0
while i < 10
puts "EM Running"
i += 1
sleep 1
end
end
Bez zatrzymując SIGINT, masz takie samo zachowanie jak podczas zatrzymując go i nazywając EM.stop. EM.stop (przynajmniej w wersji z czystym rubinem, którą można uruchomić pod numerem EVENTMACHINE_LIBRARY="pure_ruby" thin start
) ustawia flagę, która wymagała zatrzymania, która jest pobierana wewnątrz pętli reaktora. Jeśli pętla reaktora utknie na kroku (jak w powyższym przypadku), to nie wyjdzie.
więc kilka możliwości:
używają obejścia powyżej zgniecenia SIGINT i zmuszając wyjście. To może zostawić połączenia w stanie nieczystym, ale nie nazwać szybkie & brudny za nic;)
można umieścić kod blokady wewnątrz nici lub włókna, które pozwolą zachować reaktor bieganie.
Szukaj długich zadań lub pętli wewnątrz kodu i przekonwertuj je na EventMachine. Żądanie em-http jest świetną biblioteką dla zewnętrznych żądań http, a em-synchronizacja ma kilka innych protokołów (dla połączeń z bazami danych, pul połączeń TCP, itp.). W powyższym przykładzie jest to proste: EventMachine.add_periodic_timer(1) { puts "EM Running" }
w rzeczywistym kodzie, może to być trudniejsze do wyśledzenia, ale wygląda na wszelkich miejscach, gdzie tarło wątki i połączyć je, lub duże pętle. Narzędzie do profilowania może pomóc w wyświetlaniu kodu uruchamianego przy próbie wyjścia, a na końcu można spróbować wyłączyć różne części systemu i biblioteki, aby dowiedzieć się, gdzie znajduje się sprawca.
Czy możesz podać swoje pliki konfiguracyjne dla cienkich i czapek? – Anatoly
Spróbuj 'ctrl + Z', a następnie' Enter'? – Zabba
Można również wypróbować mało znany Ctrl- \, który czasami działa cuda. –