Comment limiter un pipe sous linux?

63

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.

Frédéric Grosshans
la source
1
J'ai demandé ici parce que je veux l'utiliser dans un programme, pas pour le dépannage. Mais c'est ma toute première question ici, donc je m'excuse si j'ai commis une erreur.
1
BTW, ce qui précède est une utilisation inutile de chat, vous pouvez le faire rate-limit 3k < /dev/urandom | foo.
dmckee

Réponses:

91

Pipe Viewer a cette fonctionnalité.

cat /dev/urandom | pv -L 3k | foo
Juliano
la source
1
Aussi pratique à utiliser tout en regardant la sortie d'un travail, avec -q... Par exemple:command 2>&1 | pv -q -L 3k
Attie,
17

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: il suffit d'écrire une version spécialisée de cat qui lit un caractère à la fois stdin, en le affichant chacun à stdoutet puis usleeps avant de passer. Veillez à annuler la mémoire tampon de la sortie standard , sinon cela fonctionnera plutôt saccadé.

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 avec

$ ./slowcat 10 < slowcat.c
dmckee
la source
18
Maintenant, je ressens la tentation horrible d’ajouter un "claquement" de bruit à chaque caractère et de définir la vitesse par défaut à 40 CPS, avec un délai supplémentaire pour les nouvelles lignes.
dmckee
J'utiliserais cela avec l'un de ces écrans de veille de terminal rétro pour faire rire, si des haut-parleurs étaient connectés à mes boîtes Linux.
Benny Mackney
4

l'accélérateur semble conçu spécifiquement pour cela. par exemple

cat /dev/urandom | throttle -k 3 | foo
Ponkadoodle
la source
1
Je suis d’accord avec cela, mais il ne semble pas y avoir de paquet standard pour Ubuntu. Je ne vois pas non plus le code source correspondant. Quelqu'un sait où vous pouvez obtenir cet utilitaire?
Benjamin Leinweber
1
@BenjaminLeinweber Il semble que le site Web qui héberge normalement le code soit hors ligne, mais freebsd a la source 1.2 disponible sur son serveur FTP . Vous devriez le télécharger là-bas & ./configure && make.
Ponkadoodle
3

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
Brian Holtz
la source
2

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.

Mike S
la source