Come limitare la velocità di una pipe su Linux?


63

Esiste un filtro che potrei usare per limitare un pipe su Linux? Se questo esiste, chiamiamolo limite di velocità, voglio essere in grado di digitare in un terminale qualcosa del genere

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

per inviare un flusso di byte casuali all'input standard di foo ad una velocità (inferiore a) 3 kbyte / s.


1
Ho chiesto qui perché voglio usarlo in un programma, non per la risoluzione dei problemi. Ma è la mia prima domanda qui, quindi mi scuso se ho fatto un errore.

1
A proposito, quanto sopra è un uso non necessario di cat, potresti farlo rate-limit 3k < /dev/urandom | foo.
dmckee,

Risposte:


91

Pipe Viewer ha questa funzione.

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

1
Utile anche da usare mentre guardi l'output di un lavoro, con -q... ad esempio:command 2>&1 | pv -q -L 3k
Attie

17

Direi che Juliano ha la risposta giusta se hai quello strumento, ma suggerirei anche che si tratta di un piccolo esercizio in stile K&R: basta scrivere una versione specializzata di cat che legge un personaggio alla volta stdin, output ciascuno per stdoute poi usleeps prima di andare avanti. Assicurati di annullare il buffering dell'output standard , altrimenti funzionerà piuttosto a scatti.

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;
}

Compilalo e prova con

$ ./slowcat 10 < slowcat.c

18
Ora sto provando la terribile tentazione di aggiungere un rumore "clack" a ciascun personaggio e impostare la velocità predefinita a 40 CPS, con un ritardo aggiuntivo per i newline.
dmckee,

Lo userei con uno di quei salvaschermi terminali retrò per una risatina se avessi degli altoparlanti collegati alle mie scatole di Linux.
Benny Mackney,

4

l'acceleratore sembra progettato appositamente per questo. per esempio

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

1
Sono d'accordo con questo, ma non sembra esserci un pacchetto standard per Ubuntu. Non vedo nemmeno il codice sorgente per esso. Qualcuno sa dove è possibile ottenere questa utility?
Benjamin Leinweber,

1
@BenjaminLeinweber Sembra che il sito Web che normalmente ospita il codice sia offline, ma freebsd ha il sorgente per 1.2 disponibile sul proprio server ftp . Dovresti scaricarlo lì e ./configure && make.
Ponkadoodle,

3

Ecco una soluzione all-shell che non perderà input (vedi l'idea head -1 di 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

Veloce e sporco, tutto guscio tutto il tempo (ho CentOS e pv non viene fornito di default):

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

... sporco perché sebbene sia a tasso limitato, è scoppiato a un ritmo che non posso dirti :-). Ma è utile quando hai solo bisogno di inviare dati da un posto all'altro (stavo facendo alcuni test socat) e non vuoi inondare lo schermo con immondizia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.