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.


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

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

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

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.