¿Cómo limitar la velocidad de una tubería debajo de Linux?

63

¿Hay un filtro que podría usar para limitar la velocidad de una tubería en Linux? Si esto existe, vamos a llamarlo límite de velocidad, quiero poder escribir en un terminal algo así como

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

para enviar una secuencia de bytes aleatorios a la entrada estándar de foo a una velocidad (inferior a) 3 kbytes / s.

Frédéric Grosshans
fuente
1
Pregunté aquí porque quiero usarlo en un programa, no para solucionar problemas. Pero es mi primera pregunta aquí, así que me disculpo si cometí un error.
1
Por cierto, lo anterior es un uso innecesario de gato, que podría hacer rate-limit 3k < /dev/urandom | foo.
dmckee

Respuestas:

91

Pipe Viewer tiene esta característica.

cat /dev/urandom | pv -L 3k | foo
Juliano
fuente
1
También es útil para usar mientras mira la salida de un trabajo, con -q... por ejemplo:command 2>&1 | pv -q -L 3k
Attie
17

Yo diría que Juliano tiene la respuesta correcta si tiene esa herramienta, pero también sugeriría que este es un pequeño ejercicio de estilo K&R: solo escriba una versión especializada de cat que lea un carácter a la vez stdin, salidas cada uno hacia stdouty luego usleeps antes de continuar. Asegúrese de liberar el búfer de la salida estándar , o esto se ejecutará bastante bruscamente.

Llamé a esto 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;
}

Compílalo y prueba con

$ ./slowcat 10 < slowcat.c
dmckee
fuente
18
Ahora siento la horrible tentación de agregar un ruido de "clack" a cada personaje y establecer la velocidad predeterminada a 40 CPS, con un retraso adicional para las nuevas líneas.
dmckee
Lo usaría con uno de esos protectores de pantalla de terminal retro para una risita si tuviera altavoces conectados a mis cajas de Linux.
Benny Mackney el
4

El acelerador parece diseñado específicamente para esto. p.ej

cat /dev/urandom | throttle -k 3 | foo
Ponkadoodle
fuente
1
Estoy de acuerdo con esto, pero no parece haber un paquete estándar para Ubuntu. Tampoco veo el código fuente para ello tampoco. ¿Alguien sabe dónde puede obtener esta utilidad?
Benjamin Leinweber
1
@BenjaminLeinweber Parece que el sitio web que normalmente aloja el código está fuera de línea, pero freebsd tiene la fuente 1.2 disponible en su servidor ftp . Tendrías que descargarlo allí & ./configure && make.
Ponkadoodle
3

Aquí hay una solución integral que no perderá información (vea la idea de cabeza -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
fuente
2

Rápido y sucio, todo shell todo el tiempo (tengo CentOS y pv no viene con él por defecto):

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

... sucio porque, aunque tiene una velocidad limitada, tiene una explosión que no puedo decirte :-). Pero es útil cuando solo necesita enviar datos de un lugar a otro (estaba haciendo algunas pruebas de socat) y no desea inundar su pantalla con basura.

Mike S
fuente