Limite de banda (bandwidth) nos comandos scp e rsync

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

[ Hits: 16.440 ]

Blog: https://fabio.city

 


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

O que é samba

Apache - Forçando o browser a fazer download de determinado tipo de arquivo

O que é correio eletrônico

MySQL: Duplicando uma tabela com apenas 1 comando SQL

Como limpar o cache DNS no Google Chrome

Leitura recomendada

Visualizando a quantidade de memória

Listando os últimos comandos executados no bash

Compartilhar Linux X Linux (Virtualbox)

Uma maneira fácil de fazer a cópia diretórios

Uso das chaves na linha de comando

  

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
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts