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

Fré*_*ans 72 linux pipe

是否有一个过滤器可以用来在 linux 上对管道进行速率限制?如果存在,我们称之为速率限制,我希望能够在终端中输入类似的内容

cat /dev/urandom | rate-limit 3 -k | foo
Run Code Online (Sandbox Code Playgroud)

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

Jul*_*ano 107

管道查看器具有此功能。

cat /dev/urandom | pv -L 3k | foo
Run Code Online (Sandbox Code Playgroud)

pv手册页

-L RATE, --rate-limit RATE

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

  • 在查看作业输出时也很方便,使用 `-q`... 例如:`command 2>&1 | pv -q -L 3k` (2认同)

dmc*_*ten 17

如果你有那个工具,我会说Juliano 已经得到了正确的答案,但我也建议这是一个简洁的 K&R 风格练习:只需编写一个专门版本的 cat,一次从stdin, 输出中读取一个字符每个 tostdout和然后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;
}
Run Code Online (Sandbox Code Playgroud)

编译它并尝试

$ ./slowcat 10 < slowcat.c
Run Code Online (Sandbox Code Playgroud)

  • 现在,我感受到了一种可怕的诱惑,即为每个字符添加“咔嗒”噪音并将默认速度设置为 40 CPS,换行会有额外的延迟。 (19认同)

Pon*_*dle 6

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

cat /dev/urandom | throttle -k 3 | foo
Run Code Online (Sandbox Code Playgroud)

  • 我同意这一点,但似乎没有适用于 Ubuntu 的标准软件包。我也没有看到它的源代码。有谁知道你在哪里可以得到这个实用程序? (2认同)