web-dev-qa-db-ja.com

Linuxでパイプをレート制限する方法は?

Linuxでパイプをレート制限するために使用できるフィルターはありますか?これが存在する場合は、レート制限と呼びましょう。ターミナルに次のように入力できるようにしたいと思います

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

ランダムなバイトのストリームをfooの標準入力に3 kbytes/sの速度(以下)で送信するため。

64

パイプビューア にはこの機能があります。

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

そのツールがあれば ジュリアーノは正しい答えを得ました と言いますが、これはきちんとした小さなK&Rスタイルの演習であることもお勧めします。 stdinから一度に1文字ずつ、それぞれをstdoutに出力し、次にusleepsに出力してから次に進みます。必ず 標準出力のバッファリングを解除するには を使用してください。そうしないと、ぎくしゃくした動作になります。

これを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;
}

コンパイルして試してください

$ ./slowcat 10 < slowcat.c

throttle これのために具体的に設計されているようです。例えば.

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

以下は、入力を失わないオールシェルソリューションです(Mike Sのhead -1のアイデアを参照)。

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

素早い、汚い、常にすべてのシェル(CentOSがあり、pvにはデフォルトで付属していません):

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

...汚いのは、レートが制限されているにもかかわらず、私があなたに伝えることのできないレートでバースト的だからです:-)。しかし、ある場所から別の場所にデータを送信する必要があるだけで(私はいくつかのsocatテストを行っていました)、画面をゴミでいっぱいにしたくない場合に便利です。

2
Mike S