明明打印到文件了,为啥tail -f看不到

简介: 文章《一分钟了解nohup和&的功效》留了一个“nohup.out为啥没有包含stdout输出”的尾巴,今天把坑填了。

文章《一分钟了解nohup和&的功效》留了一个“nohup.out为啥没有包含stdout输出”的尾巴,今天把坑填了。

image.png

测试代码是一个打印hello与循环轮数的死循环程序,每打印一行就休眠1秒。

image.png

使用./a.out 运行程序后,每隔一秒会在终端输出一个字符串。

image.png

使用nohup ./a.out运行程序后,有一个“忽略输入,输出至nohup.out”的提示。

image.png

把程序killall干掉之后,果然有一个nohup.out生成。

不过这个文件的大小是0,有点奇怪,启动程序的时候,明明提示了“appending output to nohup.out”呀,这是为什么呢?原本打印在终端的hello字符串去哪里了呢?

留言里不少同学猜测和2>&1 >/dev/null有关,但其实本例并未将标准输出,标准错误输出重定向。

nohup.out未能及时输出,是因为nohup后,为了提高性能stdout启用了缓冲,并不会实时把内容写入文件,只有当缓冲写满了才会刷盘。killall程序时,还来不及刷盘程序就退出了,于是出现了空nohup.out文件。

如果想要实时刷盘,可以选择:

  • 把缓冲设为空,setbuf(stdout, NULL)
  • 强制刷盘,fflush(stdout)

image.png

如上图,程序添加一行“fflush(stdout)”之后,再次测试。

image.png

就能够看到nohup.out会实时的刷新数据啦。

遗留:

  • 评论里说的2>&1 >/dev/null 是什么鬼?
  • 打印日志的时候,是需要实时刷新,还是缓存刷新呢?

额,上一篇《一分钟了解nohup和&的功效》,介绍了一个linux小知识,就被喷得厉害,评论说文章拉低了58的技术水准,下一篇回归架构,介绍“全链路调用链跟踪架构”以及“如何在小公司快速落地全链路调用链跟踪实践”。

目录
相关文章
|
4月前
|
编译器
【报错】错误 C1004 :发现意外的文件尾
【报错】错误 C1004 :发现意外的文件尾
78 0
|
6月前
|
Shell Linux 开发工具
查看日志还在用tail -f ? 要不换 less +F 试试?
查看日志还在用tail -f ? 要不换 less +F 试试?
36 0
|
10月前
|
存储 C语言
【C语言】通讯录(添加、删除、查找、修改、显示、清空、按名字排序)
【C语言】通讯录(添加、删除、查找、修改、显示、清空、按名字排序)
try catch 应该放在for里还是不该放for里
try catch 应该放在for里还是不该放for里
82 0
|
Java
JDK打印的疑问:CUPSPrinter有何用处?
JDK打印的疑问:CUPSPrinter有何用处?
71 0
|
设计模式 算法 Java
干掉 “重复代码” 的技巧有哪些
软件工程师和码农最大的区别就是平时写代码时习惯问题,码农很喜欢写重复代码而软件工程师会利用各种技巧去干掉重复的冗余代码。
106 0
干掉 “重复代码” 的技巧有哪些
|
API 开发者
这些地方容易出错 | 学习笔记
简介:快速学习这些地方容易出错
78 0
这些地方容易出错 | 学习笔记
|
测试技术
软件测试面试题:一个元素明明定位到了,点击无效(也没报错),如果解决?
软件测试面试题:一个元素明明定位到了,点击无效(也没报错),如果解决?
457 0
|
JavaScript 安全 前端开发
这个key我查了,没问题
这是个 Vue 项目, 当看到这个 TypeError: Cannot read properties of undefined(reading 'key') 这行报错的时候,我的第一反应是 v-for 绑定的 key 有问题。
这个key我查了,没问题
|
C++
VS代码中明明有NO_BITMAP字串,提示找不到
VS代码中明明有NO_BITMAP字串,提示找不到
66 0