如何实时传输unix管道中的数据?

时间:2012-12-19 13:47:23

标签: unix pipeline

据我所知,如果我们举例如“./program | grep someoutput”,它会在程序处理结束后进行。你知道吗,收入怎么做?

3 个答案:

答案 0 :(得分:2)

shell将同时生成两个进程,并将第一个的输出连接到第二个的输入。如果您有两个长时间运行的进程,那么您将在进程表中看到这两个进程。没有中间步骤,没有来自第一个程序的数据存储。它是管道,而不是管道

注意 - 可能会涉及一些缓冲。

答案 1 :(得分:1)

你错了。

管道立即收到数据,但当然,如果另一端(接收器)没有足够快地读取数据,源进程写入管道可能会阻塞。

当然,这并不一定意味着管道适用于“实时硬”。使用,但也许这不是你的意思。

答案 2 :(得分:1)

实际上,grep可以“实时”使用,因为通过管道传输的数据不会被缓冲,因此像tail -f /var/log/messages | grep something这样的东西会起作用。

如果您没有获得预期的输出,则前面的命令更可能是缓冲其输出。以双grep:

为例
tail -f /var/log/messages | grep something | grep another

grep will buffer its output when stdout is not connected to a terminal以来,输出不会立即出现,这意味着第二个grep在刷新缓冲区之前不会看到任何数据。强制行缓冲模式解决了这个问题:

tail -f /var/log/messages | grep --line-buffered something | grep another

根据缓冲的执行方式,可以使用stdbuf修改命令的缓冲模式,例如:

stdbuf -oL ./program | grep something