Como limitar um pipe no linux?

58

Existe algum filtro que eu possa usar para limitar um pipe no linux? Se isso existir, vamos chamá-lo de limite de taxa, eu quero ser capaz de digitar um terminal 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.

    
por Frédéric Grosshans 17.03.2010 / 18:37

5 respostas

80

Visualizador de canais tem esse recurso.

cat /dev/urandom | pv -L 3k | foo
    
por 17.03.2010 / 18:40
17

Eu diria que Juliano tem o resposta certa se você tiver essa ferramenta, mas eu também sugiro que este é um pequeno exercício estilo K & R: basta escrever uma versão especializada de gato que leia um caractere de cada vez em stdin , saídas cada um para stdout e, em seguida, usleep s antes de prosseguir. Certifique-se de descomprimir a saída padrão , ou isso será executado .

Eu chamei isso de 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
    
por 17.03.2010 / 18:51
4

Aqui está uma solução all-shell que não perderá a entrada (cf. a idéia da cabeça -1 do 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
    
por 05.10.2016 / 00:48
4

o acelerador parece projetado especificamente para isso. por exemplo,

cat /dev/urandom | throttle -k 3 | foo
    
por 12.02.2017 / 07:08
2

Rápido e sujo, todo shell o tempo todo (eu tenho CentOS e 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, embora seja limitado em termos de taxa, está em uma velocidade 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 inundar sua tela com lixo.

    
por 02.06.2016 / 19:35

Tags