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


63

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

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

ランダムバイトのストリームをfooの標準入力に3キロバイト/秒のレート(より低いレート)で送信するため。


1
トラブルシューティングではなくプログラムで使用したいので、ここで尋ねました。しかし、ここでの最初の質問なので、エラーを犯した場合は謝罪します。

1
ところで、上記は猫の不必要な使用です、あなたはすることができますrate-limit 3k < /dev/urandom | foo
dmckee

回答:



17

私がいることを言うと思いますジュリアーノは、正しい答えを持っているあなたは、そのツールを持っている場合、私はまた、これは小ぎれいなK&Rスタイルの行使であることをお勧めしたい:ちょうどから一度に1つの文字を読み込み、猫の特殊なバージョンを書きstdin、出力それぞれにstdout、その後usleepに移動する前にね。必ず標準出力をバッファリング解除してください。そうしないと、かなり不安定になります。

私はこれを呼んだ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

18
今、私は各キャラクターに「クラック」ノイズを追加し、デフォルト速度を40 CPSに設定し、改行のための余分な遅延を設定するという恐ろしい誘惑を感じています。
dmckee

Linuxボックスにスピーカーが接続されていれば、レトロな端末のスクリーンセーバーの1つでそれを使用してくすくす笑います。
ベニーマックニー16年

4

スロットルはこれ専用に設計されているようです。例えば

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

1
私はこれに同意しますが、Ubuntu用の標準パッケージはないようです。私もそのソースコードを見ていません。このユーティリティを入手できる場所は誰でも知っていますか?
ベンジャミンレインウェーバー

1
@BenjaminLeinweber コードを通常ホストするWebサイトはオフラインのようですが、freebsdにはFTPサーバーで1.2のソースがあります。そこにダウンロードする必要があります&./configure && make
ポンカドゥードル

3

入力を失わない全シェルソリューションを次に示します(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

2

速くて汚い、いつもすべてのシェル(私はCentOSを持っていますが、デフォルトではpvには付属していません):

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.