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:
[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.
[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:
[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.
[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.: