web-dev-qa-db-fra.com

Comment limiter un pipe sous linux?

Existe-t-il un filtre que je pourrais utiliser pour limiter le taux d’un tuyau sous Linux? Si cela existe, appelez-le limite de taux, 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 débit (inférieur à) 3 Ko/s.

63

Pipe Viewer possède cette fonctionnalité.

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

Je dirais que Juliano a la bonne réponse si vous avez cet outil, mais je suggérerais également qu'il s'agit d'un petit exercice de style K & R soigné. : écrivez simplement une version spécialisée de cat qui lit un caractère à la fois, à partir de stdin, les édite chacun en stdout, puis usleeps avant de poursuivre. Assurez-vous de supprimer la mémoire tampon de la sortie standard , sinon cela fonctionnera plutôt rapidement.

J'ai appelé ce 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 avec

$ ./slowcat 10 < slowcat.c
17
dmckee

étranglement semble conçu spécifiquement pour cela. par exemple.

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

Voici une solution 100% Shell qui ne perdra pas sa contribution (cf. l’idée principale -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
3
BrianHoltz

Rapide et sale, tout Shell tout le temps (j'ai CentOS et pv ne vient pas avec elle 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 même si son taux est limité, il est rapide à un taux que je ne peux pas vous dire :-). Mais c’est pratique lorsque vous avez juste besoin d’envoyer des données d’un endroit à un autre (j’ai fait quelques tests socat) et que vous ne voulez pas submerger votre écran de déchets.

2
Mike S