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