2011-06-23 19 views
5

bundle exec thin start -p 3111 निम्नलिखित उत्पादन देता है:पतला SIGINT या SIGTERM का जवाब नहीं है

रैक अनुकूलक का उपयोग करना पतला वेब सर्वर (v1.2.11 कोडनेम बैट-छी पागल) अधिकतम कनेक्शन 1024 करने के लिए सेट पर 0.0.0.0:3111 सुनकर, CTRL + C को रोकने के लिए ^ सी

Ctrl-C कुछ भी (SIGINT) नहीं करता है। न तो मारता है (SIGTERM)।

मुझे इस व्यवहार के कुछ संदर्भ मिल गए हैं, लेकिन कोई समाधान नहीं है। यह समस्या इवेंटमाचिन (नवीनतम पतली के साथ बंडल) में होती है, रूबी 1.9.2-आर 2 9 0 में, या लिनक्स कर्नेल (उबंटू 10.4 एलटीएस, 2.6.38.3-लिनोड 32) में।

यह मेरे प्रोजेक्ट के साथ होता है, लेकिन एक ब्रांड नई रेल परियोजना के साथ नहीं।

संदर्भ:

+0

क्या आप अपनी पतली और टोपी कॉन्फ़िगरेशन फाइलें प्रदान कर सकते हैं? – Anatoly

+0

'ctrl + z' और फिर' एंटर 'आज़माएं? – Zabba

+0

आप छोटे ज्ञात Ctrl- \ को भी आजमा सकते हैं जो कभी-कभी अद्भुत काम करता है। –

उत्तर

5

मेरा अनुमान है कि या तो कुछ EventMachine रिएक्टर पाश बांधने ऊपर है यह बाहर निकलने से रोक रहा है, या कुछ और SIGINT फँसाने रहा है।

पूर्व का एक सरल उदाहरण के रूप में, config.ru में डाल और 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 

SIGINT फँसाने के बिना, आप जब यह फँसाने और EM.stop कॉल करने जैसा ही व्यवहार मिलता है। EM.stop (कम से कम शुद्ध रूबी संस्करण में, जिसे आप EVENTMACHINE_LIBRARY="pure_ruby" thin start के साथ चला सकते हैं) एक ध्वज सेट करता है कि एक स्टॉप अनुरोध किया गया है, जिसे रिएक्टर लूप के अंदर उठाया जाता है। यदि रिएक्टर लूप एक चरण (जैसे उपर्युक्त मामले में) पर फंस गया है, तो यह बाहर नहीं निकलेगा।

तो कुछ विकल्प:

  1. SIGINT फँसाने और एक निकास के लिए मजबूर कर के ऊपर तरीके का उपयोग। यह एक अशुद्ध राज्य में कनेक्शन छोड़ सकता है, लेकिन वे यह कॉल नहीं करते त्वरित & गंदा कुछ नहीं के लिए;)

  2. आप एक धागा या एक फाइबर, जो रिएक्टर रखने के लिए अनुमति देगा अंदर अवरुद्ध कोड डाल सकता है चल रहा है।

  3. अपने कोड के अंदर लंबे समय तक चलने वाले कार्यों या लूप की तलाश करें, और इन्हें EventMachine को अवगत कराएं। em-http-request बाहरी http अनुरोधों के लिए एक महान लाइब्रेरी है, और एम-सिंक्रनाइज़ में कई अन्य प्रोटोकॉल हैं (डेटाबेस कनेक्शन, टीसीपी कनेक्शन पूल, आदि के लिए)। उपरोक्त उदाहरण में, यह स्पष्ट है: EventMachine.add_periodic_timer(1) { puts "EM Running" }

अपने वास्तविक कोड में, यह पता लगाने, लेकिन किसी भी स्थानों पर जहां आप धागे अंडे और उन्हें शामिल होने, या बड़े छोरों देखने के लिए कठिन हो सकता है। एक प्रोफाइलिंग टूल यह दिखाने में सहायता कर सकता है कि जब आप बाहर निकलने का प्रयास करते हैं तो कौन सा कोड चल रहा है, और आखिरकार आप सिस्टम और पुस्तकालयों के विभिन्न हिस्सों को अक्षम करने का प्रयास कर सकते हैं ताकि यह पता चल सके कि अपराधी कहां है।

+0

आपके विस्तृत उत्तर के लिए धन्यवाद। उम्मीद है कि यह समस्या को समझने के लिए मुझे पर्याप्त लीड देगा। –