Limite de banda (bandwidth) nos comandos scp e rsync

Publicado por Fábio Berbert de Paula em 30/01/2008

[ Hits: 21.627 ]

Blog: https://fabio.automatizando.dev

 


Limite de banda (bandwidth) nos comandos scp e rsync



Na empresa onde trabalho não existe limite de banda pra download nas estações, porém se abusarmos um dia a regalia pode acabar. Então pra evitar que minhas transferências de arquivos entre máquinas usando scp e/ou rsync não consumam toda a banda do escritório, fui buscar uma forma de limitar a velocidade de transferência de tais comandos.

Então vamos direto ao ponto!

Por exemplo, pra impôr um limite de 8kbps ao scp, adicione o parâmetro "-l [LIMITE]" ao comando:

$ scp -l 80 arquivoGrande.tgz fabio@servidor_remoto:/usr/local/

Onde 80 é a conta aproximada de 8kbps. Resumindo, adicione um zero à direita e boa. Se alguém souber explicar isso poste no comentário aí.

Pra repetir o comando usando o rsync, o parâmetro passa a ser --bwlimit. Exemplo:

$ rsync --bwlimit=80 arquivoGrande.tgz fabio@servidor_remoto:/usr/local/

PS: Estou partindo do princípio que você conhece a sintaxe dos comandos acima, o objetivo é mostrar como fazer o limite de velocidade/banda.

Um abraço.

Outras dicas deste autor

MySQL: Duplicando uma tabela com apenas 1 comando SQL

Como forçar o APT a ignorar determinada dependência

Converter imagens para fundo transparente via linha de comando

Vim - incrementando números em substituição

Otimizando Digitação no Terminal Bash

Leitura recomendada

Adicionando SWAP no OpenBSD

Instalando pacotes RPM no Slackware 13.0

Como filtrar exatamente uma palavra no terminal

Salvo pelo SED!

Alguns comandos pkg no FreeBSD

  

Comentários
[1] Comentário enviado por tinti em 30/01/2008 - 11:09h

No wget usamos
--limit-rate=20000 para 20kbps

[2] Comentário enviado por fabio em 30/01/2008 - 11:54h

Boa tinti! Tinha me esquecido do wget :)

[3] Comentário enviado por hipnos em 31/01/2008 - 10:01h

no scp vc deve colocar um zero à direita pois é Kbit/s e não Kbyte/s

[4] Comentário enviado por italog em 18/08/2009 - 15:18h

olá,

Preciso fazer transferências de arquivos utilizando limite de banda, uso o rsync para isso. (as tranferencias devem levar dias em alguns casos)

Nos testes que fiz tudo funcionou corretamente, inclusive quando cancelo o envio em determinados momentos para aumentar/diminuir a largura de banda.

Para interromper a transferência uso o comando 'killall -9 rsync'.

Irei desenvolver uma aplicação para automatizar essas transferências e para ser mais prático para o usuário, sem ter que entrar no shell e digitar linhas de comando.

PROBLEMA: Quando estiverem sendo executadas várias transferências rsync e o agendamento verificar que deve haver uma alteração no limite de banda de uma transferência especifica, como irei saber qual processo matar? pois nesse caso se eu utilizar o killall -9 rsync irá parar todas as trasferências. Sendo que só quero interroper uma específica.

Pensei se tem como pegar o pid do processo no momento que ele é startado, assim guardaria este pid em uma variável ligada àquele agendamento e no momento de alterar a banda ele só "mataria" o processo desejado.

Outra idéia que tive, mas acho que não serve, é: sem matar o processo só iniciar uma nova transferencia coma mesma linha de comando utilizada na anterior, apenas mudando o limite de banda, e assim, automaticamento o rsync interrope uma e inicia a outra, mas nos meus testes as duas transferencias continuam ao mesmo tempo.

Alguma idéia que possa me ajudar?

Obrigado

[5] Comentário enviado por fabio em 19/08/2009 - 04:33h

Olá Italo,

Sobre escolher que processo rsync matar, aí vai variar de acordo com a implementação de seus scripts mesmo. Uma dica é tentar isolar os processos usando o comando "ps ax", veja:

$ ps ax | grep rsync
4401 pts/1 R+ 0:16 rsync -Cravzp projetos zizao:~/
4464 pts/1 R+ 0:16 rsync -Cravzp fotos zizao:~/

Então levando em conta que quero pegar o rsync do diretório "projetos", posso fazer assim:

$ ps ax | grep rsync | grep projetos | cut -d ' ' -f 2 | xargs kill

Basta adaptar sua solução agora :)

Um abraço.

[6] Comentário enviado por italog em 19/08/2009 - 13:17h

estou fazendo um aplicativo em php...

ele irá enviar, na maioria dos casos, o mesmo diretório para diferentes destinatários, e o que quero é trocar o limite de banda de um destinatário específico.
Por isso não dá para ser como você sugeriu Fábio, pois ao matar o rsync baseado em um diretório iria matar todos os envios.

Aí tenho duas idéias que não sei se são possíveis, pois ainda não descobri como fazer:
1- pegar o pid de cada transferência, no início do processo e armazenar esse pid em uma variável relacionada com aquele determinado destinatário
Um colega me mostrou que ao dar a linha de comando com o &1 ao final ele libera o shell e imprime o pid na tela, assim só devo descobrir como ler o pid da tela e armazená-lo na variavel

2- Se tiver como filtrar os processos pelo destinatário, algo como ps aux | grep rsync | grep userdest |cut -d ' ' -f 2 | xargs kill, onde o 'userdest' é o destinatário também pode funcionar.

Aguardo seu ultimato...

desde já agradeço sua atenção

Ítalo

[7] Comentário enviado por fabio em 19/08/2009 - 13:27h

Você pode usar a opção --log-file para distinguir os comandos. Use-a como a primeira opção, assim ela aparece na saída do "ps ax" e você pode usar a linha de comando que te passei. Ex.:

rsync --log-file=usuario1 ...
rsync --log-file=usuario2 ...

$ ps ax | grep rsync | grep usuario2 | cut -d ' ' -f 2 | xargs kill

[]'s



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts