2011-06-23 71 views
5

bundle exec thin start -p 3111 cho đầu ra sau đây:Thin không đáp ứng với SIGINT hoặc SIGTERM

Sử dụng bộ chuyển đổi giá Thin máy chủ web (v1.2.11 tên mã Bát-Chết tiệt điên) kết nối tối đa 1024 lắng nghe trên 0.0.0.0:3111, CTRL + C để dừng ^ C

Ctrl-C không làm bất cứ điều gì (SIGINT). Không giết (SIGTERM).

Tôi đã tìm thấy một vài tham chiếu đến hành vi này, nhưng không có giải pháp. Vấn đề có vẻ là hoặc trong eventmachine (kèm với mới nhất mỏng), trong ruby ​​1.9.2-r290, hoặc trong hạt nhân Linux (Ubuntu 10.4 LTS, 2.6.38.3-linode32).

Điều đó xảy ra với dự án của tôi, nhưng không phải với dự án đường ray hoàn toàn mới.

Tài liệu tham khảo:

+0

bạn có thể cung cấp các tệp cấu hình mỏng và nắp của mình không? – Anatoly

+0

Thử 'ctrl + Z' và sau đó là' Enter'? – Zabba

+0

Bạn cũng có thể thử Ctrl-\ ít được biết đến mà đôi khi làm việc kỳ diệu. –

Trả lời

5

tôi đoán là một trong hai điều gì đó trói vòng lặp EventMachine lò phản ứng ngăn không cho nó thoát, hoặc một cái gì đó của bẫy SIGINT.

Là một ví dụ đơn giản của cựu, đưa điều này vào config.ru và chạy với 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 

Nếu không có bẫy các SIGINT, bạn sẽ có hành vi tương tự như khi bẫy nó và gọi EM.stop. EM.stop (ít nhất là trong phiên bản ruby ​​thuần túy, mà bạn có thể chạy với EVENTMACHINE_LIBRARY="pure_ruby" thin start) đặt một cờ mà một yêu cầu dừng được yêu cầu, được chọn bên trong vòng lặp lò phản ứng. Nếu vòng lặp lò phản ứng bị kẹt trên một bước (như trong trường hợp trên), thì nó sẽ không thoát ra.

Vì vậy, một vài lựa chọn:

  1. sử dụng workaround trên của bẫy SIGINT và buộc một lối ra. Điều này có thể rời khỏi các kết nối trong tình trạng ô uế, nhưng họ không gọi nó là nhanh & bẩn cho không có gì;)

  2. bạn có thể đặt mã chặn bên trong một chủ đề hoặc một sợi, mà sẽ cho phép các lò phản ứng để giữ đang chạy.

  3. tìm các tác vụ hoặc vòng lặp dài bên trong mã của bạn và chuyển đổi các tính năng này thành EventMachine. em-http-request là một thư viện tuyệt vời cho các yêu cầu http bên ngoài và đồng bộ hóa em có một số giao thức khác (cho các kết nối cơ sở dữ liệu, các nhóm kết nối tcp, v.v.). Trong ví dụ trên, đây là đơn giản: EventMachine.add_periodic_timer(1) { puts "EM Running" }

Trong mã thực tế của bạn, điều này có thể khó khăn hơn để theo dõi xuống, nhưng tìm kiếm bất kỳ nơi bạn sinh ra chủ đề và tham gia cùng họ, hoặc vòng lớn. Một công cụ lược tả có thể giúp hiển thị mã nào đang chạy khi bạn cố gắng thoát ra, và cuối cùng bạn có thể thử vô hiệu hóa các phần khác nhau của hệ thống và các thư viện để tìm ra thủ phạm.

+0

Cảm ơn bạn đã trả lời chi tiết. Hy vọng rằng điều này sẽ cho tôi đủ khách hàng tiềm năng để tìm ra vấn đề. –

Các vấn đề liên quan