前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >明明打印到文件了,为啥tail -f看不到

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

作者头像
架构师之路
发布2018-07-27 17:12:23
7700
发布2018-07-27 17:12:23
举报
文章被收录于专栏:架构师之路

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

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

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

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

把程序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)

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

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

遗留:

  • 评论里说的2>&1 >/dev/null 是什么鬼?
  • 打印日志的时候,是需要实时刷新,还是缓存刷新呢?
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档