2011-06-23 15 views
5

bundle exec thin start -p 3111 daje następujący wynik:Cienki nie reaguje na SIGINT lub SIGTERM

Korzystanie szaf rack Cienki serwer WWW (v1.2.11 kryptonim Bat-Cholera Szalony) Maksymalna liczba połączeń ustawiona na 1024 słuchanie na 0.0.0.0:3111, CTRL + C, aby zatrzymać ^ C

Ctrl-C nie robi nic (SIGINT) zrobić. Nie zabija też (SIGTERM).

Znalazłem kilka odniesień do tego zachowania, ale bez rozwiązań. Problem wydaje się być albo w eventmachine (w pakiecie z najnowszymi cienkimi), w Ruby 1.9.2-r290, albo w jądrze Linux (Ubuntu 10.4 LTS, 2.6.38.3-linode32).

Zdarza się z moim projektem, ale nie z zupełnie nowym projektem szyn.

Odniesienia:

+0

Czy możesz podać swoje pliki konfiguracyjne dla cienkich i czapek? – Anatoly

+0

Spróbuj 'ctrl + Z', a następnie' Enter'? – Zabba

+0

Można również wypróbować mało znany Ctrl- \, który czasami działa cuda. –

Odpowiedz

5

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:

  1. 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;)

  2. można umieścić kod blokady wewnątrz nici lub włókna, które pozwolą zachować reaktor bieganie.

  3. 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.

+0

Dziękujemy za szczegółową odpowiedź. Mam nadzieję, że da mi to wystarczająco dużo informacji, aby rozwiązać problem. –

Powiązane problemy