73 votes

Comment limiter le débit d'un tuyau sous linux ?

Existe-t-il un filtre que je pourrais utiliser pour limiter le débit d'un tuyau sous linux ? Si cela existe, appelons-le rate-limit, je veux être capable de taper dans un terminal quelque chose comme

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

afin d'envoyer un flux d'octets aléatoires à l'entrée standard de foo à un taux (inférieur à) 3 kbytes/s.

110voto

gareth_bowles Points 8717

Visionneuse de tuyaux possède cette caractéristique.

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

Desde le site pv Manpage :

-L RATE, --rate-limit RATE

Limitez le transfert à un maximum de TARIFS octets par seconde. Un suffixe "k", "m", "g" ou "t" peut être ajouté pour désigner les kilo-octets (*1024), les méga-octets, etc.

17voto

spong Points 875

Je dirais que Juliano a la bonne réponse si vous disposez de cet outil, mais je suggère également qu'il s'agit d'un petit exercice de style K&R : écrivez simplement une version spécialisée de cat qui lit un caractère à la fois à partir de stdin et de les transmettre à stdout et ensuite usleep avant de passer à autre chose. Soyez sûr pour débuffer la sortie standard ou cela fonctionnera plutôt mal.

J'ai appelé ça 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;
}

Compilez-le et essayez-le avec

$ ./slowcat 10 < slowcat.c

6voto

jwaddell Points 542

papillon des gaz semble conçu spécifiquement pour cela. Par exemple

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

3voto

BrianHoltz Points 31

Voici une solution tout-Shell qui ne perd pas l'entrée (cf. l'idée de tête -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

2voto

ashwoods Points 1479

Rapide et sale, tout Shell tout le temps (j'ai CentOS et pv n'est pas livré avec par défaut) :

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

...sale parce que, bien qu'il soit à débit limité, il est éclaté à un rythme que je ne peux pas vous dire :-) . Mais c'est pratique quand on a juste besoin d'envoyer des données d'un endroit à l'autre (je faisais des tests socat) et qu'on ne veut pas inonder son écran de déchets.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X