Linux:对于“tail -f filename”,只有在\ n后才能读取读取行吗?

时间:2011-04-15 08:50:23

标签: linux bash file-io

Initial File:
line 1
line 2
line 3

File after append 1:
line 1
line 2
line 3
lin

File after append 2:
line 1
line 2
line 3
line 4

如果我执行“tail -f filename”,然后文件如上所述进行更新,

尾部是否继续更新半行,还是只返回原子线?

我保证在追加1之后看到/不看“lin”吗? 如果“第4行”之后没有\ n,我会看到它吗?

特别是,我对能否阅读原子线感兴趣。我正在运行日志监控应用程序,我只想解析完整的行。日志文件可能会更新为半行,如果tail不保证原子行,我将不得不防范(即通过char读取char,然后在看到\ n时识别一行)。

3 个答案:

答案 0 :(得分:1)

在我的mac(9.8.0 Darwin Kernel Version 9.8.0)上,内置tail会显示附加到文件的字符。这是一个小测试:

import sys, time

def write(fname):
  fd = open(fname, 'wb')
  try:
    while True:
      for i in range(0, 5): 
        fd.write('a')
        fd.flush()
        print >>sys.stderr, "Wrote a char"
        time.sleep(2)
      fd.write('\n')
      fd.flush()
      print >>sys.stderr, "Wrote newline"
      time.sleep(2)
  finally:
    fd.close()

if __name__ == '__main__':
  write(sys.argv[1])

运行:python test.py test.txt,然后tail -f test.txt。它显示出现了a-s。

答案 1 :(得分:0)

根据手册页:

-f, --follow[={name|descriptor}]
          output appended data as the file grows; -f, --follow, and --follow=descriptor are equivalent

这意味着你会看到每个角色都被追加,而不只是在新线上。但是,我想tail会采用某种刷新策略,所以你看到的可能取决于文件的更新速度。我只能建议你试验一下。

答案 2 :(得分:0)

事情是有缓冲。

Tail可能会做缓冲,但源可能是线路缓冲。如果源在您的控制之下,请尝试禁用输出缓冲并查看其运行方式