当我们想一边监控一个程序的输出,一边又想将输出记录到一个文件当中的时候,tee命令就是一个非常好的选择
./buffer_demo | tee a.txt
比如上面的命令,将buffer_demo程序的输出打印到屏幕上,同时写入a.txt文件
当buffer_demo持续输出比较多的文本的时候,上面的命令运行的没有什么问题。
但是如果buffer_demo使用的是printf这样的标准io库的函数,并且输出文本速度很慢的时候,我们可能半天也看不到屏幕上有输出。这是因为当你使用管道的时候,标准io库发现stdout是一个管道,于是会启用块缓冲,有时这个缓冲会达到8192字节。
比如buffer_demo程序
#include <stdio.h>
#include <unistd.h>
int main(void) {
while (1) {
printf("123\n");
sleep(1);
}
return 0;
}
需要输出很久才能达到一块
当然在拥有源码的情况下我们可以加一个fflush来解决这个问题
比如这样
#include <stdio.h>
#include <unistd.h>
int main(void) {
while (1) {
printf("123\n");
fflush(stdout);
sleep(1);
}
return 0;
}
但是更多数的情况是我们没有源码
这时候我们可以使用expect自带的一个名为unbuffer的工具,像这样,就可以去掉缓存的影响
unbuffer ./buffer_demo | tee a.txt

2223




被折叠的 条评论
为什么被折叠?



