2011-11-30 17 views
5

Sunucumdan günlük olarak bir yedekleme dosyasını yerel depolama sunucuma indirmeye çalışıyorum ama bazı sorunlarım var.Python ile FTP yoluyla büyük dosyaları indirin

I (e-posta fonksiyonu olarak yararsız parçaları kaldırıldı,) bu kodu yazmış

:

import os 
from time import strftime 
from ftplib import FTP 
import smtplib 
from email.MIMEMultipart import MIMEMultipart 
from email.MIMEBase import MIMEBase 
from email.MIMEText import MIMEText 
from email import Encoders 

day = strftime("%d") 
today = strftime("%d-%m-%Y") 

link = FTP(ftphost) 
link.login(passwd = ftp_pass, user = ftp_user) 
link.cwd(file_path) 
link.retrbinary('RETR ' + file_name, open('/var/backups/backup-%s.tgz' % today, 'wb').write) 
link.delete(file_name) #delete the file from online server 
link.close() 
mail(user_mail, "Download database %s" % today, "Database sucessfully downloaded: %s" % file_name) 
exit() 

Ve böyle bir crontab ile bu çalıştırın:

40 23 * * * python /usr/bin/backup-transfer.py >> /var/log/backup-transfer.log 2>&1 
Küçük dosyalarla çalışır

ama yedekler dosyaları (yaklaşık 1.7Gb) ile donar, indirilen dosya 1.2Gb hakkında daha sonra asla büyümez (bir gün bekledim) ve günlük dosyası boş.

Herhangi bir fikrin var mı?

P.S.: im Sen aşımını ayarlama deneyebilirsiniz Python 2.6.5

+0

Sorunu daha fazla gidermek için, indirme ilerlemesi hakkında daha fazla bilgi toplamak için '' geri arama '' argümanını 'FTP.retrbinary'den kullanabilirsiniz. Ayrıca, "maxblocksize" ile oynamak bazı ağ sorunlarını ortaya çıkarabilir. – jcollado

cevap

6

Maalesef ben kendi soruya cevap ama çözüm bulursa.

hiçbir başarı ile ftputil uğraş, bu yüzden birçok yolu uğraş ve son olarak, bu çalışır: buldum benim günlük dosyasında

def ftp_connect(path): 
    link = FTP(host = 'example.com', timeout = 5) #Keep low timeout 
    link.login(passwd = 'ftppass', user = 'ftpuser') 
    debug("%s - Connected to FTP" % strftime("%d-%m-%Y %H.%M")) 
    link.cwd(path) 
    return link 

downloaded = open('/local/path/to/file.tgz', 'wb') 

def debug(txt): 
    print txt 

link = ftp_connect(path) 
file_size = link.size(filename) 

max_attempts = 5 #I dont want death loops. 

while file_size != downloaded.tell(): 
    try: 
     debug("%s while > try, run retrbinary\n" % strftime("%d-%m-%Y %H.%M")) 
     if downloaded.tell() != 0: 
      link.retrbinary('RETR ' + filename, downloaded.write, downloaded.tell()) 
     else: 
      link.retrbinary('RETR ' + filename, downloaded.write) 
    except Exception as myerror: 
     if max_attempts != 0: 
      debug("%s while > except, something going wrong: %s\n \tfile lenght is: %i > %i\n" % 
       (strftime("%d-%m-%Y %H.%M"), myerror, file_size, downloaded.tell()) 
      ) 
      link = ftp_connect(path) 
      max_attempts -= 1 
     else: 
      break 
debug("Done with file, attempt to download m5dsum") 
[...] 

: Ne yazık ki

01-12-2011 23.30 - Connected to FTP 
01-12-2011 23.30 while > try, run retrbinary 
02-12-2011 00.31 while > except, something going wrong: timed out 
    file lenght is: 1754695793 > 1754695793 
02-12-2011 00.31 - Connected to FTP 
Done with file, attempt to download m5dsum 

i yeniden zorunda Dosya tamamen indirilmiş olsa bile, benim casda bir sorun değil, becose md5sum da indirmeliyim.

Gördüğünüz gibi, zaman aşımı tespit edemedim ve bağlantıyı yeniden denedim, ancak zaman aşımı olduğunda, yalnızca yeniden bağlanmayı; Birisi yeni bir ftplib.FTP örneği oluşturmadan nasıl yeniden bağlanacağını biliyorsanız, bana bildirin;)

2

kullanarak. docs Gönderen:

# timeout in seconds 
link = FTP(host=ftp_host, user=ftp_user, passwd=ftp_pass, acct='', timeout=3600) 
2

Bağlantıyı izleyebilen, yeniden bağlanabilen ve hata durumunda dosyayı yeniden yükleyebilen kodu ftplib ile uyguladım. Burada ayrıntıları: How to download big file in python via ftp (with monitoring & reconnect)?

+0

Teşekkürler, biraz boş zaman bulduğumda ona bir bakacağım;) – Strae

+0

@roman i'm senaryonuzu kullanarak iboyutunu indirdikten sonra 2GB'lık bir dosya boyutu indirdim. 'dst_filesize'. – ashim888

İlgili konular