Como limitar a taxa de um tubo no linux?


63

Existe um filtro que eu poderia usar para limitar a taxa de um tubo no Linux? Se isso existir, vamos chamá-lo de limite de taxa, quero poder digitar em um terminal algo como

cat /dev/urandom | rate-limit 3 -k | foo

para enviar um fluxo de bytes aleatórios para a entrada padrão do foo a uma taxa (menor que) 3 kbytes / s.


11
Eu perguntei aqui porque quero usá-lo em um programa, não para solucionar problemas. Mas é a minha primeira pergunta aqui, então peço desculpas se cometi um erro.

11
BTW, o acima é um uso desnecessário de gato, você poderia fazer rate-limit 3k < /dev/urandom | foo.
— dmckee

Respostas:


91

O Pipe Viewer possui esse recurso.

cat /dev/urandom | pv -L 3k | foo

11
Também é útil para usar enquanto assiste à saída de um trabalho, com -q... por exemplo:command 2>&1 | pv -q -L 3k
— Attie

17

Eu diria que Juliano tem a resposta certa se você tiver essa ferramenta, mas também sugeriria que este é um pequeno exercício de estilo K&R: basta escrever uma versão especializada de gato que lê um caractere de cada vez stdin, produz cada um stdoute depois usleeps antes de prosseguir. Certifique-se de tampar a saída padrão , ou isso ocorrerá de maneira instável.

Eu chamei isso slowcat.c:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char**argv){
  int c;
  useconds_t stime=10000; // defaults to 100 Hz

  if (argc>1) { // Argument is interperted as Hz
    stime=1000000/atoi(argv[1]);
  }

  setvbuf(stdout,NULL,_IONBF,0);

  while ((c=fgetc(stdin)) != EOF){
    fputc(c,stdout);
    usleep(stime);
  }

  return 0;
}

Compile e tente com

$ ./slowcat 10 < slowcat.c

18
Agora estou com a horrível tentação de adicionar um ruído "clack" a cada personagem e definir a velocidade padrão para 40 CPS, com um atraso extra para novas linhas.
— dmckee

Eu usaria isso com um desses protetores de tela de terminal retrô para dar uma risadinha se tivesse alto-falantes conectados às minhas caixas Linux.
— Benny Mackney

4

acelerador parece projetado especificamente para isso. por exemplo

cat /dev/urandom | throttle -k 3 | foo

11
Eu concordo com isso, mas não parece haver um pacote padrão para o Ubuntu. Também não estou vendo o código fonte dele. Alguém sabe onde você pode obter esse utilitário?
— Benjamin Leinweber

11
@BenjaminLeinweber Parece que o site que normalmente hospeda o código está offline, mas o freebsd tem a fonte do 1.2 disponível em seu servidor ftp . Você teria que baixá-lo lá e ./configure && make.
— Ponkadoodle

3

Aqui está uma solução totalmente concha que não perderá informações (consulte a idéia do cabeçalho -1 de Mike S):

hexdump -c /dev/urandom | (lines=0; while read line; do echo $line; if [ $((++lines % 10)) -eq 0 ]; then sleep 1; fi; done) | cat -n

2

Rápido e sujo, com shell o tempo todo (eu tenho o CentOS e o pv não vem com ele por padrão):

hexdump -c /dev/urandom | while true; do head -1; sleep 1; done | \
your_program_that_reads_stdin  -your_argument_list

... sujo porque, apesar de ser limitado, está cheio a um ritmo que não posso lhe dizer :-). Mas é útil quando você só precisa enviar dados de um lugar para outro (eu estava fazendo alguns testes socat) e você não quer encher a tela com lixo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.