如何在Linux下限制管道的速率?

如何在Linux下限制管道的速率?

有没有一个过滤器可以用来限制 Linux 上的管道速率?如果存在,就叫它速率限制,我希望能够在终端中输入类似

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

为了以低于 3 kbytes/s 的速率将随机字节流发送到 foo 的标准输入。

答案1

管道查看器有这个功能。

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

手册pv

-L RATE,--速率限制RATE

将转移限制为最大速度每秒字节数。可以添加“k”、“m”、“g”或“t”后缀来表示千字节(*1024)、兆字节等。

答案2

我想说的是Juliano 给出了正确答案如果您有该工具,但我还建议这是一个简洁的 K&R 风格练习:只需编写一个专门的 cat 版本,每次从 读取一个字符stdin,将每个字符输出到 ,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

答案3

风门似乎经过设计具体来说为此。例如

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

答案4

快速而肮脏,始终都是 shell(我有 CentOS,但 pv 默认不自带):

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

...dirty,因为虽然它的速率有限,但它的突发速率我无法告​​诉你 :-)。但当你只需要将数据从一个地方发送到另一个地方时(我正在做一些 socat 测试),它很方便,而且你不想让屏幕上充斥着垃圾。

相关内容