2012-11-01 12 views
5

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

def scrape_url(url) 
    url_found = false 
    twitter_name = nil 

    begin 
    agent = Mechanize.new do |a| 
     a.follow_meta_refresh = true 
    end 

    agent.get(normalize_url(url)) do |page| 
     url_found = true 
     twitter_name = find_twitter_name(page) 
    end 

    @err << "[#{@current_record}] SUCCESS\n" 
    rescue Exception => e 
    @err << "[#{@current_record}] ERROR (#{url}): " 
    @err << e.message 
    @err << "\n" 
    end 

    [url_found, twitter_name] 
end 

नोट::

यहाँ कोड है कि आप एक ही URL scrapes की एक प्रति है मैं भी इस कोड है कि एक ही मशीनीकरण उदाहरण भर में सभी scrape_url करने के लिए कॉल साझा हो रही है कि बनाता है की एक संस्करण को चलाने गए हैं। यह बिल्कुल वही फैशन में विफल रहा।

जब मैं EC2 पर इस चलाने के लिए, यह लगभग ठीक 1,000 यूआरएल के माध्यम से हो जाता है, तो के लिए शेष 9,000+ इस त्रुटि देता है:

getaddrinfo: Temporary failure in name resolution 

ध्यान दें, मैं दोनों अमेज़न के DNS सर्वरों और गूगल के DNS का उपयोग की कोशिश की है सर्वर, सोच रहा है कि यह एक वैध DNS मुद्दा हो सकता है। मुझे दोनों मामलों में बिल्कुल वही परिणाम मिला।

फिर, मैंने इसे अपने स्थानीय मैकबुक प्रो पर चलाने की कोशिश की।

getaddrinfo: nodename nor servname provided, or not known 

किसी को भी पता है कि कैसे मैं स्क्रिप्ट रिकॉर्ड सभी के माध्यम से इसे बनाने के लिए प्राप्त कर सकते हैं: यह केवल रिकॉर्ड के शेष के लिए इस त्रुटि लौटने से पहले लगभग 250 के माध्यम से मिल गया?

+0

हमें दिखाएं कि यह यूआरएल असफल रहा है। – pguardiario

+0

यह उनमें से लगभग 9, 000 में विफल रहता है। एक उदाहरण http://www.agilecommerce.com है। ब्राउज़र में प्लग इन होने पर यूआरएल काम करता है। – EricM

+0

क्या आप स्मृति से बाहर हो सकते हैं? – pguardiario

उत्तर

7

मैं समाधान का उपयोग करने से इतिहास रखेंगे। मैकेनाइजेशन कनेक्शन को खोलने और जीसी पर भरोसा करने के लिए भरोसा कर रहा था। एक निश्चित बिंदु के बाद, पर्याप्त खुले कनेक्शन थे कि DNS लुकअप करने के लिए कोई अतिरिक्त आउटबाउंड कनेक्शन स्थापित नहीं किया जा सका। यहाँ कोड है कि यह काम करने के लिए कारण होता है:

agent = Mechanize.new do |a| 
    a.follow_meta_refresh = true 
    a.keep_alive = false 
end 

गलत पर keep_alive की स्थापना करके, कनेक्शन तुरंत बंद कर दिया और साफ है।

0

देखने के लिए कि इस मदद करता है:

agent.history.max_size = 10 

यह बहुत अधिक मेमोरी

संबंधित मुद्दे