¿Existe una herramienta existente que se pueda usar para descargar archivos grandes a través de una mala conexión?
Tengo que descargar regularmente un archivo relativamente pequeño: 300 MB, pero la conexión TCP lenta (80-120 KBytes / seg) se rompe aleatoriamente después de 10-120 segundos. (Es la red de una gran empresa. Contactamos a sus administradores (que trabajan desde India) varias veces, pero no pueden o no quieren hacer nada). El problema podría estar en sus servidores proxy / balanceadores de carga inversos.
Hasta ahora, utilizaba una versión modificada de pcurl: https://github.com/brunoborges/pcurl
Cambié esta línea:
curl -s --range ${START_SEG}-${END_SEG} -o ${FILENAME}.part${i} ${URL} &
a esto:
curl -s --retry 9999 --retry-delay 3 --speed-limit 2048 --speed-time 10 \
--retry-max-time 0 -C - --range ${START_SEG}-${END_SEG} -o ${FILENAME}.part${i} ${URL} &
Tuve que agregar --speed-limit 2048 --speed-time 10
porque la conexión casi siempre se cuelga durante minutos cuando falla.
Pero recientemente, incluso este script no se puede completar.
Un problema es que parece ignorar la -C -
parte, por lo que no "continúa" el segmento después de un reintento. Parece truncar el archivo temporal relacionado y comenzar desde el principio después de cada error. (Creo que el --range
y las -C
opciones no se pueden utilizar juntos.)
El otro problema es que este script descarga todos los segmentos al mismo tiempo. No puede tener 300 segmentos, de los cuales solo 10 se descargan a la vez.
Estaba pensando en escribir una herramienta de descarga en C # para este propósito específico, pero si hay una herramienta existente, o si el comando curl podría funcionar correctamente con diferentes parámetros, entonces podría dedicar algo de tiempo.
ACTUALIZACIÓN 1: Información adicional: la funcionalidad de descarga paralela no debe eliminarse, ya que tienen un límite de ancho de banda (80-120 Kbytes / seg, principalmente 80) por conexión, por lo que 10 conexiones pueden causar una aceleración de 10 veces. Tengo que terminar la descarga del archivo en 1 hora, porque el archivo se genera cada hora.
rsync
(que le permitirá reiniciar las transferencias)?lftp
También permite reiniciar automáticamente las transmisiones.Respuestas:
lftp
( Wikipedia ) es bueno para eso. Admite varios protocolos, puede descargar archivos usando varias conexiones paralelas simultáneas (útil cuando hay mucha pérdida de paquetes no causada por congestión) y puede reanudar automáticamente las descargas. También es programable.Aquí, incluido el ajuste fino que se le ocurrió (créditos para usted):
fuente
lftp -e 'set net:timeout 15; set net:max-retries 0; set net:reconnect-interval-base 3; set net:reconnect-interval-max 3; pget -n 10 -c "https://host/file.tar.gz"; exit'
net:idle
configuración. ¡Gracias! Agregaré mi solución a la pregunta.Content-MD5
yDigest
(aunque no sé si loslftp
admite o si se usarían en el caso del OP). En cualquier caso, no parece que torrent sea una opción para el OP.No puedo probar esto en tu situación, pero no deberías usarlo
--range
con-C -
. Esto es lo que la página del manual tiene que decir sobre el tema:Intenta esto en su lugar:
También recomiendo encarecidamente que siempre doble comillas sus variables para que el shell no intente analizarlas. (Considere una URL
https://example.net/param1=one¶m2=two
, donde el shell dividiría el valor en&
).Por cierto, 120 KB / s es aproximadamente 1.2 Mb / s, que es una velocidad de carga xDSL típica en muchas partes del mundo. 10 segundos por MB, un poco menos de una hora para todo el archivo. No es tan lento, aunque aprecio que estés más preocupado por la confiabilidad que por la velocidad.
fuente
Quizás tengas más suerte con
wget --continue
:Ver también https://www.cyberciti.biz/tips/wget-resume-broken-download.html
fuente
Fuera de la caja: colóquese un parche en el ojo y use bittorrent. Haz el tamaño de bloque pequeño cuando crees el torrent. Obviamente, encripte el archivo para que cualquier otra persona que encuentre el torrent no obtenga nada útil.
fuente
Tuve el mismo problema en mi trabajo anterior (excepto con copias de seguridad de bases de datos externas de 300GB + en una conexión inestable (desde la oficina)). Los usuarios tuvieron graves problemas para descargar un archivo de más de aprox. 1 GB antes de que se desconectara la conexión. Dado que utilizaron el archivo estándar de copiar / pegar de Windows a través de una conexión RDP, no es de extrañar.
Una cosa que descubrí fue que nuestra configuración de VPN no coincidía completamente con la configuración de la red (principalmente la longitud de MTU). La segunda cosa es que la copiadora de archivos de Windows NO está hecha para copiar cosas a través de Internet.
Mi primera solución fue un servidor FTP simple, sin embargo, no resolvió el problema del tiempo de transmisión (a menudo 3-4 horas en nuestra conexión).
Mi segunda solución fue usar Syncthing para enviar los archivos directamente a un NAS interno. Cada noche, después de completar las copias de seguridad, Syncthing enviaba todo lo que necesitábamos a un NAS en la oficina. No solo se resolvió el problema del tiempo de transmisión de más de 3 horas, sino que se me ahorraron las 1-2 horas para enviar los datos en caso de crisis. A las 8 de la mañana todas las mañanas, los archivos se actualizarían en el NAS, y teníamos nuestras copias de seguridad listas. Incluso con archivos enormes (en un momento una base de datos de casi 700 GB), todavía tengo que experimentar cualquier corrupción de archivos u otros problemas ...
Syncthing es muy fácil de configurar y administrar y está disponible para todas las plataformas (incluso teléfonos), y tiene un muy buen manejo de malas conexiones ... si la conexión falla, Syncthing simplemente espera unos minutos e intenta nuevamente.
Necesitas una carpeta local para sincronizar las cosas, pero tus archivos estarán disponibles casi tan pronto como se actualicen.
Otra cosa buena sobre la sincronización es que se puede configurar para sincronizar solo los cambios en el archivo (como en una copia de seguridad diferencial) ... posiblemente resolviendo una parte de su problema de ancho de banda.
fuente
Puede considerar una solución de la vieja escuela para mover archivos a través de una conexión pésima: zmodem .
Esto se desarrolló cuando 2400 módems en baudios con personas que levantaban los teléfonos y bombardeaban la conexión era la norma. Podría valer la pena probar.
fuente
Podrías intentar usar Kermit :
fuente