Linux:对于 "tail -f filename",是否仅在\n 之后跟随读取行?

标签 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”,然后文件如上更新,

tail 是继续更新半行,还是只返回原子行?

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

特别是,我对是否可以读取原子行很感兴趣。我正在运行一个日志监控应用程序,我只想解析完整的行。日志文件可能会更新到半行,如果 tail 不能保证原子行,我将不得不防止这种情况(即逐个字符读取一个字符,然后在我看到\n 时识别一行)。

最佳答案

在我的 mac(9.8.0 Darwin 内核版本 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。

关于Linux:对于 "tail -f filename",是否仅在\n 之后跟随读取行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5674378/

相关文章:

linux - 我如何搜索 > 进入 bash 脚本

bash - 在 Mac 上为环境变量使用钥匙串(keychain)密码

C# - 从 Directory.GetDirectories() 和 Directory.GetFiles() 中排除目录和文件

perl - Perl 中的 Fork 无法在从文件读取的 while 循环内工作

java - exec,文件位置问题

python使用子进程连接文件

linux - 在 bash 脚本中使用 grep 命令将变量值传递给 --include 参数

c - linux中sleep命令的使用

mysql - 在 bash 脚本中从 MySQL 数据库写入变量

bash - 如何在 MAC OSX 上限制程序内存使用的示例