2010-04-01 8 views
12

मैं एक कार्यक्रम urllib का उपयोग करता है समय-समय पर एक यूआरएल को लाने के लिए है, और मुझे रुक-रुक कर त्रुटियों की तरह देखें:I/O त्रुटि (सॉकेट त्रुटि): [errno 111] कनेक्शन अस्वीकृत

I/O त्रुटि (सॉकेट त्रुटि): [Errno 111] कनेक्शन से इनकार कर दिया।

यह 90% समय काम करता है, लेकिन आर 10% यह विफल रहता है। यदि विफल होने के तुरंत बाद fetch को पुनः प्रयास करें, तो यह सफल हो जाता है। मैं यह समझने में असमर्थ हूं कि ऐसा क्यों है। मैंने यह देखने की कोशिश की कि क्या कोई बंदरगाह उपलब्ध है, और वे हैं। कोई डीबगिंग विचार?

अतिरिक्त जानकारी के लिए, स्टैक ट्रेस है:

File "/usr/lib/python2.6/urllib.py", line 203, in open 
    return getattr(self, name)(url) 

File "/usr/lib/python2.6/urllib.py", line 342, in open_http 
    h.endheaders() 

File "/usr/lib/python2.6/httplib.py", line 868, in endheaders 
    self._send_output() 

File "/usr/lib/python2.6/httplib.py", line 740, in _send_output 
    self.send(msg) 

File "/usr/lib/python2.6/httplib.py", line 699, in send 
    self.connect() 

File "/usr/lib/python2.6/httplib.py", line 683, in connect 
    self.timeout) 

File "/usr/lib/python2.6/socket.py", line 512, in create_connection 
    raise error, msg 

संपादित करें - एक Google खोज नहीं बहुत उपयोगी है, क्या मैं इसे से बाहर हो गया है कि सर्वर मैं से प्राप्त करते समय कर रहा हूँ कभी कभी कनेक्शन मना कर दिया है , मैं इसे अपने कोड में बग नहीं कैसे सत्यापित कर सकता हूं और यह वास्तव में मामला है?

+3

क्या करता है "मैं यह देखने की कोशिश की के साथ समस्या यह है कि वापस आ जाएगी कनेक्शन वरना साथ कोई समस्या नहीं है कि वहाँ कोई बंदरगाह उपलब्ध हैं, और वे हैं। " क्या मतलब है? यदि आप एक ECONNREFUSED प्राप्त कर रहे हैं जो एक सकारात्मक प्रतिक्रिया है - कच्चे सॉकेट परत पर - रिमोट होस्ट से "मैं आपको दस्तक देता हूं लेकिन कोई भी सुन रहा नहीं है"; यह आमतौर पर एक ओवरलोडेड सर्वर से परिणाम होता है। आपका पुनः प्रयास इंगित करता है कि यह आपके 90/10% अनुपात के रूप में क्षणिक है। यह साबित करने के लिए कि यह आपका कोड नहीं है? सर्वर पोर्ट के लिए टेलनेट। कनेक्शन का प्रयास करने के लिए एक पाइथन सॉकेट लेयर रूटीन लिखें और आपको हिट/इनकार अनुपात दें। – msw

उत्तर

36

क्या होता है यह देखने के लिए Wireshark जैसे पैकेट स्निफ़र का उपयोग करें। आपको एक एसईएन-फ्लैग किए गए पैकेट आउटगोइंग, एक एसईएन + एसीके-फ्लैग किए गए इनकमिंग और फिर एसीके-फ्लैग आउटगोइंग देखना होगा। उसके बाद, बंदरगाह को स्थानीय तरफ खुला माना जाता है।

यदि आपको केवल पहला पैकेट दिखाई देता है और त्रुटि संदेश प्रतीक्षा के कई सेकंड बाद आता है, तो दूसरी तरफ जवाब नहीं दे रहा है (जैसे: अनप्लग्ड केबल, अधिभारित सर्वर, गुमराह किए गए पैकेट को त्याग दिया गया था) और आपका स्थानीय नेटवर्क ढेर कनेक्शन प्रयास बंद कर देता है। यदि आप आरएसटी पैकेट देखते हैं, तो मेजबान वास्तव में कनेक्शन से इनकार करता है। यदि आप "आईसीएमपी पोर्ट पहुंच योग्य नहीं" देखते हैं या पहुंचने योग्य पैकेट होस्ट करते हैं, तो फ़ायरवॉल या लक्षित होस्ट आपको वास्तव में बंद बंदरगाह के बारे में सूचित करता है।

बेशक आप सेवा को हर समय उपलब्ध होने की उम्मीद नहीं कर सकते (सभी और डेटा के बीच विफलता के सभी बिंदुओं पर विचार करें), तो आपको बाद में पुनः प्रयास करना चाहिए।

2

मुझे बिल्कुल यकीन नहीं है कि इसका क्या कारण है। आप अपने socket.py को देखने का प्रयास कर सकते हैं (मेरा एक अलग संस्करण है, इसलिए ट्रेस से लाइन नंबर मेल नहीं खाते हैं, और मुझे डर है कि कुछ अन्य विवरण भी मेल नहीं खाते हैं)।

वैसे भी, यह आपके यूआरएल फ़ेचिंग कोड को try: ... except: ... ब्लॉक में डालने के लिए एक अच्छा अभ्यास प्रतीत होता है, और इसे एक छोटी रोक और पुनः प्रयास के साथ संभाल लें। जिस URL को आप लाने का प्रयास कर रहे हैं वह डाउन हो सकता है, या बहुत लोड हो सकता है, और यह सामान आप केवल वैसे भी पुनः प्रयास करने में सक्षम होंगे।

10

एक ECONNREFUSED errno हो रही है इसका मतलब है कि अपने गिरी दूसरे छोर पर एक कनेक्शन से इनकार कर दिया था, इसलिए यदि यह एक बग है, यह या तो अपने कर्नेल में या दूसरे छोर में है।

# This is Python > 2.5 code 
import errno, time 

for attempt in range(MAXIMUM_NUMBER_OF_ATTEMPTS): 
    try: 
     # your urllib call here 
    except EnvironmentError as exc: # replace " as " with ", " for Python<2.6 
     if exc.errno == errno.ECONNREFUSED: 
      time.sleep(A_COUPLE_OF_SECONDS) 
     else: 
      raise # re-raise otherwise 
    else: # we tried, and we had no failure, so 
     break 
else: # we never broke out of the for loop 
    raise RuntimeError("maximum number of unsuccessful attempts reached") 

अपने पसंदीदा नंबर से बदलें दो सब-टोपी स्थिरांक: आप क्या कर सकते हैं, क्योंकि यह काम करने लगता है एक बहुत विशिष्ट तरीके से जाल त्रुटि और थोड़ी देर में फिर से कोशिश करने के लिए है।

3

मुझे पहले मेरे ईसी 2 इंस्टेंस के साथ यह समस्या थी (मैं संसाधनों की सेवा के लिए कॉचडब की सेवा कर रहा था - भविष्य के लिए अमेज़ॅन के एस 3 पर विचार कर रहा हूं)।

जांचने की एक बात (Ec2 मानना) यह है कि आपकी सुरक्षा नीति के भीतर सोफेडब पोर्ट आपके खुले बंदरगाहों में जोड़ा जाता है।

मैं विशेष रूप से

का सामना करना पड़ा "[errno 111] कनेक्शन अस्वीकृत"

EC2 से अधिक

जब उदाहरण के बंद कर दिया गया था और शुरू कर दिया। समस्या एक पिडफाइल दौड़ प्रतीत होता है। मेरे लिए समाधान CouchDB (पूरी तरह से और ठीक से) के माध्यम से की हत्या की गई थी:

pkill -f couchdb 

और उसके बाद के साथ पुन: प्रारंभ:

/etc/init.d/couchdb restart 
0

इसके कि सर्वर ठीक से इतना है कि यह सुनिश्चित टर्मिनल के साथ

से नहीं चल रहा है लगता है
telnet ip port 

उदाहरण

telnet localhost 8069 

यह स्थानीय होस्ट से जुड़ा वापस आ जाएगी तो यह इंगित करता है यह कनेक्शन अस्वीकृत यह इंगित करता है कि कनेक्शन

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