如何在Linux下对管道进行速率限制?


63

是否可以使用过滤器对Linux上的管道进行速率限制?如果存在,请称之为速率限制,我希望能够在终端中输入类似

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

为了以3 KB / s的速率向foo的标准输入发送随机字节流。


1
我在这里问是因为我想在程序中使用它,而不是用于故障排除。但这是我的第一个问题,因此如果出现错误,我深表歉意。

1
顺便说一句,以上是对猫的不必要使用,可以做到rate-limit 3k < /dev/urandom | foo
dmckee 2010年

Answers:



17

我想说的是,如果您拥有该工具,朱利安诺将得到正确的答案,但我也建议这是一个简洁的K&R风格练习:只需编写专门版本的cat即可一次从中读取一个字符stdin,输出在继续之前先分别到达stdoutusleep。一定要取消缓冲标准输出,否则这将相当不稳定。

我叫这个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,2010年

如果我的Linux机顶盒装有扬声器,我会在那些复古的终端屏保之一中使用它来咯咯地笑。
Benny Mackney

4

油门似乎是专门为此设计的。例如

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

1
我会同意这一点,但是似乎没有适用于Ubuntu的标准软件包。我也没有看到它的源代码。有人知道您可以从哪里获得此实用程序吗?
本杰明·莱恩韦伯

1
@BenjaminLeinweber看起来通常是托管代码网站是脱机的,但是freebsd的ftp服务器上有1.2的源。您将不得不在那里下载它./configure && make
Ponkadoodle

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测试)并且不想用垃圾堆满屏幕时,这很方便。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.