Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux:For";tail-f filename";,是否只有在a之后才有后续读取行\n?_Linux_Bash_File Io - Fatal编程技术网

Linux:For";tail-f filename";,是否只有在a之后才有后续读取行\n?

Linux:For";tail-f filename";,是否只有在a之后才有后续读取行\n?,linux,bash,file-io,Linux,Bash,File Io,如果我做了一个“tail-f filename”,然后文件会像上面那样更新 tail是继续更新半行,还是只返回原子行 i、 e 我保证在附加1后看到/不看到“lin”吗? 如果“第4行”后面没有\n,我会看到它吗 我特别感兴趣的是我是否能读懂原子线。我正在运行一个日志监控应用程序,我只想分析完整的行。日志文件可能会被更新为半行,如果tail不能保证原子行,我将不得不对此加以防范(即逐字符读取,然后在看到时识别一行)。根据手册页: Initial File: line 1 line 2 line

如果我做了一个“tail-f filename”,然后文件会像上面那样更新

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

i、 e

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


我特别感兴趣的是我是否能读懂原子线。我正在运行一个日志监控应用程序,我只想分析完整的行。日志文件可能会被更新为半行,如果tail不能保证原子行,我将不得不对此加以防范(即逐字符读取,然后在看到时识别一行)。

根据手册页:

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采用了某种刷新策略,所以您看到的可能取决于文件更新的速度。我只能建议你做一点实验。

在我的mac(
9.8.0达尔文内核版本9.8.0
)上,内置的
尾部显示附加到文件中的字符。下面是一个小测试:

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

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

问题是存在缓冲


Tail可能会进行缓冲,但源代码很可能是linebuffering。如果源代码在您的控制下,请尝试禁用输出缓冲,然后查看如何进行

对不起,这没有帮助。当我打开2个shell时,在shell 1上我执行
tail-f filename
,在shell 2上我执行
echo'hi'>>filename
,它显示在shell 1中。在shell 2中,我写了一些数据,然后保存,但没有。因此没有实时跟踪:它跟踪文件描述符。如果您希望通过定期刷新来实时跟踪,请使用
tail--follow=name filename
@Konerak-我不认为这有什么帮助。正如我建议的那样,它促使你进行实验。我不知道答案,但我认为建议如何着手寻找答案是合理的。我认为DV在这里是相当苛刻的。这可能很难,但我会关注这个问题,所以如果你的答案有所改善,我会改变投票结果。这不是一个答案,充其量只是一个提示人们进行实验的评论;)@有用吗我想这是在重复这个问题,我遗漏了一个细节。0票似乎是合适的。是的,我真正关心的是刷新、缓冲和其他我不知道的IO内容;我继承了一个传统的程序,它假设行是完整的,但这种假设是脆弱的。如果只有在读操作(每3秒0.001s)与写操作(每1.2秒0.001s)一致时才失败,该怎么办?即使存在一个false,也意味着无法保证所有行都将作为一个整体读取只是验证逻辑。感谢您的测试和找到一个反例。当我在我的服务器上测试时,它读取了整行内容,可能是因为我不知道如何配置这些内容。@Dingfeng Quek:我假设它是实现定义的。
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])