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.

Frédéric Grosshans
fonte
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
Juliano
fonte
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
dmckee
fonte
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
Ponkadoodle
fonte
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
BrianHoltz
fonte
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.

Mike S
fonte