有没有一个过滤器可以用来限制 Linux 上的管道速率?如果存在,就叫它速率限制,我希望能够在终端中输入类似
cat /dev/urandom | rate-limit 3 -k | foo
为了以低于 3 kbytes/s 的速率将随机字节流发送到 foo 的标准输入。
答案1
答案2
我想说的是Juliano 给出了正确答案如果您有该工具,但我还建议这是一个简洁的 K&R 风格练习:只需编写一个专门的 cat 版本,每次从 读取一个字符stdin
,将每个字符输出到 ,stdout
然后输出usleep
s ,然后再继续。确保取消缓冲标准输出,否则运行起来会比较不顺畅。
我称之为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 测试),它很方便,而且你不想让屏幕上充斥着垃圾。