2011-03-23 8 views
7

के साथ एसएफटीपी/एसएसएच सत्र टाइमआउट को रोकें मैं एक एसएफटीपी सर्वर से कनेक्ट करने के लिए paramiko का उपयोग कर रहा हूं जिस पर मुझे कुछ फ़ाइलों को डाउनलोड और संसाधित करना है।पैरामीको

सर्वर समय समाप्त 5 मिनट के लिए सेट है, लेकिन कुछ दिन ऐसा होता है कि फ़ाइलों के प्रसंस्करण समय समाप्ति से अधिक समय लग सकता है। तो, जब मैं कुछ अन्य फ़ाइलों sftp.chdir(target_dir)) मैं एक अपवाद है कि कनेक्शन का समय समाप्त हो गया है मिल संसाधित करने के लिए सर्वर पर कार्यशील निर्देशिका बदलना चाहते हैं:

फ़ाइल buildbdist.win32eggparamikosftp: //ftp.py, लाइन 138, _write_all में बढ़ा EOFError()

इस का मुकाबला करने के लिए मैंने सोचा था कि जीवित रखने को सक्रिय करने के लिए सबसे अच्छा विकल्प तो मैं 30 सेकंड के लिए सेट करने के लिए परिवहन पर इस्तेमाल किया "set_keepalive" होगा:

ssh = paramiko.SSHClient() 
ssh.set_missing_hostkey_policy(paramiko.AutoAddPolicy()) 
ssh.connect(ssh_server, port=ssh_port, username=ssh_user, password=password) 
transport = ssh.get_transport() 
transport.set_keepalive(30) 
sftp = transport.open_sftp_client() 

लेकिन कुछ भी नहीं बदलता है। परिवर्तन का कोई प्रभाव नहीं पड़ा है। मैं अगर मैं set_keepalive की अवधारणा गलत समझ रहा हूँ यहाँ या हो सकता है सर्वर (जिस पर मेरे पास कोई उपयोग कर सकते है) पर ध्यान नहीं देता जिंदा पैकेट रख पता नहीं है।

इस इस समस्या का मुकाबला करने के लिए सही रास्ता नहीं है या मैं एक अलग दृष्टिकोण की कोशिश करनी चाहिए? मुझे सत्र को जीवंत रखने के लिए सर्वर पर कुछ ls कमांड "मैन्युअल रूप से" भेजने का विचार पसंद नहीं है।

+1

keepalive पैकेट अपने सर्वर अनदेखी कर रहे हैं। वे केवल समय से नेटवर्क कनेक्शन रखने के लिए हैं। – JimB

उत्तर

3

सर्वर निष्क्रियता के लिए आप बाहर समय है, तो वहाँ बहुत ज्यादा नहीं आप क्लाइंट-साइड (अन्य की तुलना में शायद हर अब और फिर एक साधारण आदेश भेजने के समय बाहर से अपने सत्र रखने के लिए) से कर सकते हैं।

आप अपने डाउनलोड और प्रसंस्करण चरणों अलग तोड़ने, ताकि आप, तो यह संसाधित करने एसिंक्रोनस रूप से सब कुछ आप के साथ शुरू करने की आवश्यकता डाउनलोड कर सकते हैं, या सभी डाउनलोड पूरा करने के बाद माना जाता है?

+0

ठीक है, मैं देखता हूं। मैं प्रक्रिया के एक नए स्वरूप के बारे में भी सोच रहा था ताकि प्रसंस्करण/डाउनलोड एसिंक हो लेकिन यह काफी काम होगा जिसके लिए मेरे पास वर्तमान में कोई समय नहीं है। ऐसा लगता है कि मैं दुर्भाग्यपूर्ण हूं कि "जीवित रहने" के साथ समाधान काम नहीं करेगा। एक और प्रयास जो मैं कोशिश कर सकता था सर्वर से दोबारा कनेक्ट करने के लिए जब मुझे लगता है कि सत्र में टाइमआउट है। – Patric

+0

हां, पुन: कनेक्शन एक अच्छा समाधान होगा। आप socket.error और EOFError पर पुनः कनेक्ट कर सकते हैं, और यह पर्याप्त होना चाहिए। –

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