¿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.


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

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

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

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.