ITPub博客

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

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

作者:58沈剑 时间:2019-12-30 15:24:31 0 删除 编辑

文章《一分钟了解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 是什么鬼?

  • 打印日志的时候,是需要实时刷新,还是缓存刷新呢?

 

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


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31556838/viewspace-3127370/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 12.读写高可用
请登录后发表评论 登录
全部评论
58速运CTO,互联网架构技术专家,“架构师之路”公众号作者。曾任百度高级工程师,58同城技术委员会主席,高级架构师,58到家技术委员会主席,高级技术总监,目前主要负责58速运技术部。

注册时间:2018-09-30

  • 博文量
    420
  • 访问量
    82608