AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 428233
Accepted
Crouching Kitten
Crouching Kitten
Asked: 2018-03-06 03:50:13 +0800 CST2018-03-06 03:50:13 +0800 CST 2018-03-06 03:50:13 +0800 CST

Baixe um arquivo grande por causa de uma conexão ruim

  • 772

Existe uma ferramenta existente, que pode ser usada para baixar arquivos grandes em uma conexão ruim?

Eu tenho que baixar regularmente um arquivo relativamente pequeno: 300 MB, mas a conexão TCP lenta (80-120 KBytes/seg) quebra aleatoriamente após 10-120 segundos. (É a rede de uma grande empresa. Entramos em contato com seus administradores (trabalhando da Índia) várias vezes, mas eles não podem ou não querem fazer nada.) O problema pode estar em seus proxies reversos / balanceadores de carga.

Até agora usei uma versão modificada do pcurl: https://github.com/brunoborges/pcurl

Eu mudei esta linha:

curl -s --range ${START_SEG}-${END_SEG} -o ${FILENAME}.part${i} ${URL} &

para isso:

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} &

Eu tive que adicionar --speed-limit 2048 --speed-time 10porque a conexão geralmente trava por minutos quando falha.

Mas, recentemente, nem mesmo esse script pode ser concluído.

Um problema é que ele parece ignorar a -C -parte, então não "continua" o segmento após uma nova tentativa. Parece truncar o arquivo temporário relacionado e começar do início após cada falha. (Acho que --rangeas -Copções e não podem ser usadas juntas.)

O outro problema é que esse script baixa todos os segmentos ao mesmo tempo. Não pode ter 300 segmentos, dos quais apenas 10 estão sendo baixados por vez.

Eu estava pensando em escrever uma ferramenta de download em C# para essa finalidade específica, mas se houver uma ferramenta existente ou se o comando curl funcionar corretamente com parâmetros diferentes, posso poupar algum tempo.

ATUALIZAÇÃO 1: Informações adicionais: A funcionalidade de download paralelo não deve ser removida, porque eles têm um limite de largura de banda (80-120 Kbytes / seg, principalmente 80) por conexão, portanto, 10 conexões podem causar um aumento de velocidade de 10 vezes. Tenho que terminar o download do arquivo em 1 hora, pois o arquivo é gerado de hora em hora.

http curl
  • 7 7 respostas
  • 27149 Views

7 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2018-03-06T06:08:35+08:002018-03-06T06:08:35+08:00

    lftp( Wikipedia ) é bom para isso. Ele suporta vários protocolos, pode baixar arquivos usando várias conexões paralelas simultâneas (útil onde há muita perda de pacotes não causada por congestionamento) e pode retomar downloads automaticamente. Também é programável.

    Aqui, incluindo o ajuste fino que você criou (créditos para você):

    lftp -c 'set net:idle 10
             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"'
    
    • 39
  2. roaima
    2018-03-06T06:22:39+08:002018-03-06T06:22:39+08:00

    Não posso testar isso para você na sua situação, mas você não deve usar --rangecom -C -. Aqui está o que a página de manual tem a dizer sobre o assunto:

    Use -C -to tell curlpara descobrir automaticamente onde/como retomar a transferência. Em seguida, ele usa os arquivos de saída/entrada fornecidos para descobrir isso.

    Tente isso em vez disso:

    curl -s --retry 9999 --retry-delay 3 --speed-limit 2048 --speed-time 10 \
        --retry-max-time 0 -C - -o "${FILENAME}.part${i}" "${URL}" &
    

    Eu também recomendo fortemente que você sempre coloque aspas duplas em suas variáveis ​​para que o shell não tente analisá-las. (Considere uma URL https://example.net/param1=one&param2=two, onde o shell dividiria o valor em &.)

    Aliás, 120 KB/s é aproximadamente 1,2 Mb/s, que é uma velocidade de upload xDSL típica em muitas partes do mundo. 10 segundos por MB, ou seja, pouco menos de uma hora para o arquivo inteiro. Não tão lento, embora eu aprecie que você esteja mais preocupado com a confiabilidade do que com a velocidade.

    • 13
  3. Alex338207
    2018-03-06T06:04:41+08:002018-03-06T06:04:41+08:00

    Talvez você tenha mais sorte com wget --continue:

    wget --continue ${URL}
    

    Veja também https://www.cyberciti.biz/tips/wget-resume-broken-download.html

    • 9
  4. Loren Pechtel
    2018-03-06T20:18:47+08:002018-03-06T20:18:47+08:00

    Fora da caixa: coloque um tapa-olho e use bittorrent. Reduza o tamanho do bloco ao criar o torrent. Obviamente, criptografe o arquivo para que qualquer outra pessoa que encontre o torrent não receba nada de útil.

    • 4
  5. Tylon Foxx
    2018-03-07T01:55:29+08:002018-03-07T01:55:29+08:00

    Eu tive o mesmo problema em meu trabalho anterior (exceto com backups de banco de dados externos de 300 GB ou mais em uma conexão instável (do escritório). Os usuários tiveram problemas graves para baixar arquivos maiores que aprox. 1 GB antes da conexão cair. Como eles usaram o arquivo padrão de copiar/colar do Windows em uma conexão RDP, não é de admirar.

    Uma coisa que descobri foi que nossas configurações de VPN eram completamente incompatíveis com a configuração da rede (principalmente o comprimento do MTU). A segunda coisa é que a copiadora de arquivos do Windows NÃO foi feita para copiar coisas pela Internet.

    Minha primeira solução foi um servidor FTP simples, porém, não resolveu o problema do tempo de transmissão (geralmente 3-4 horas em nossa conexão).

    Minha segunda solução foi usar o Syncthing para enviar os arquivos diretamente para um NAS interno. Todas as noites, após a conclusão dos backups, o Syncthing enviava tudo o que precisávamos de volta para um NAS no escritório. Não apenas o problema de mais de 3 horas de tempo de transmissão foi resolvido, mas também fui poupado de 1 a 2 horas para enviar os dados se houvesse uma crise. Todas as manhãs, às 8h, os arquivos eram atualizados no NAS e tínhamos nossos backups prontos. Mesmo com arquivos enormes (a certa altura, um banco de dados de quase 700 GB), ainda não experimentei nenhum arquivo corrompido ou outros problemas...

    O Syncthing é muito fácil de configurar e gerenciar e está disponível para todas as plataformas (até mesmo telefones) e lida muito bem com conexões ruins. Se a conexão falhar, o Syncthing simplesmente espera alguns minutos e tenta novamente.

    Você precisa de uma pasta local para sincronizar as coisas, mas seus arquivos estarão disponíveis quase assim que forem atualizados.

    Outra coisa boa sobre o syncthing é que ele pode ser configurado para sincronizar apenas as alterações no arquivo (como em um backup diferencial)... possivelmente resolvendo parte do seu problema de largura de banda.

    • 4
  6. BoredBsee
    2018-03-07T11:39:59+08:002018-03-07T11:39:59+08:00

    Você pode considerar uma solução tradicional para mover arquivos em uma conexão ruim - zmodem .

    Isso foi desenvolvido quando os modems de 2400 baud com pessoas pegando os telefones e bombardeando a conexão eram a norma. Pode valer a pena tentar.

    • 1
  7. Wallace Howery
    2018-03-07T15:27:51+08:002018-03-07T15:27:51+08:00

    Você pode tentar usar o Kermit :

    O recurso que distingue o protocolo Kermit da maioria dos outros é sua ampla gama de configurações para permitir a adaptação a qualquer tipo e qualidade de conexão entre quaisquer dois tipos de computador - comprimento do pacote, codificação do pacote, tamanho da janela, conjunto de caracteres, método de detecção de erros, tempos limite , faz uma pausa. A maioria dos outros protocolos são projetados para funcionar apenas em certos tipos ou qualidades de conexões e/ou entre certos tipos de computadores ou sistemas de arquivos semelhantes e, portanto, funcionam mal (ou não funcionam) em outros lugares e oferecem poucos ou nenhum método para se adaptar a problemas não planejados. -para situações. O Kermit, por outro lado, permite que você obtenha uma transferência de arquivos bem-sucedida e o melhor desempenho possível em qualquer conexão."

    • 0

relate perguntas

  • Por que o haproxy registra o código de status 200 ao usar "http-response set-status <not-200>"?

  • Como enrolar e descompactar para um determinado diretório? [duplicado]

  • Verificando um redirecionamento de URL do terminal

  • Obtendo o endereço URL do arquivo e verificando o código HTTP

  • Como baixar um arquivo no terminal cujo link redireciona e parece funcionar apenas na GUI?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve