在 bash 中没有简单的方法可以做到这一点,但你可以在 C 中做到这一点。但首先,也许你可以不写每 N 行?要仅将第 100 行写入文件,您可以:
slowprogram | sed -n '1~100p' > file
无论如何,让我们使用 C sn-p 实现真正的非阻塞。由于 at 的作用类似于缓冲区但实际上并非如此,我们可以将其称为 bluffer.c:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BUFFER_SIZE 4096
int main(int argc, char** argv) {
int out;
char buffer[BUFFER_SIZE];
int c;
out = open("/dev/stdout", O_NONBLOCK | O_APPEND | O_WRONLY);
while((c = read(0, buffer, BUFFER_SIZE)) != 0) {
write(out, buffer, c);
}
}
现在考虑一个快速生成一百万行 (~6.8MB) 数据的命令:
time printf "%s\n" {1..1000000} > /dev/null
real 0m1.278s
现在让我们通过pv 将其速率限制为 1MB/s 来模拟慢速 IO:
time printf "%s\n" {1..1000000} | pv -q -L 1M > slowfile
real 0m7.514s
正如预期的那样,它需要更长的时间,但slowfile 包含所有 1,000,000 行。
现在让我们插入虚张声势:
time printf "%s\n" {1..1000000} | ./bluffer | pv -q -L 1M > fastfile
real 0m1.972s
这次又很快结束了,fastfile 仅包含 1,000,000 行中的 141,960 行。在该文件中,我们看到如下所示的空白:
52076
52077
188042
188043