Come valutare-limitare un pipe sotto Linux?

C'è un filter che potrei usare per valutare-limitare un pipe su Linux? Se questo esiste, lasciamelo call limite di velocità, voglio essere in grado di digitare un terminal qualcosa di simile

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

per submit un stream di byte casuali all'input standard di foo ad una velocità (inferiore a 3 kbytes / s).

Pipe Viewer ha questa caratteristica.

 cat /dev/urandom | pv -L 3k | foo 

Direi che Juliano ha la risposta giusta se si dispone di questo strumento, ma suggerirei anche che questo è un piccolo esercizio di stile K & R: basta scrivere una versione specializzata di gatto che legge un personaggio alla volta da stdin , uscite ciascuno a stdout e poi usleep s prima di passare. Assicurarsi di disconnettere l'output standard , o questo functionrà piuttosto sconveniente.

Ho chiamato questo 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; } 

Compila e prova con

 $ ./slowcat 10 < slowcat.c 

Ecco una soluzione a tutto schermo che non perderà l'input (cfr l'idea di testa -1 da 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 

Rapido e sporco, tutto il guscio tutto il tempo (ho CentOS e pv non viene con esso per impostazione predefinita):

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

… sporco perché anche se il tasso è limitato, è bursty ad un tasso che non posso dirti :-). Ma è utile quando hai solo bisogno di submit dati da un posto all'altro (stavo facendo alcuni esami di socat) e non volete inondare lo schermo con spazzatura.

il gas sembra progettato appositamente per questo. per esempio

 cat /dev/urandom | throttle -k 3 | foo