Linux:For";tail-f filename";,是否只有在a之后才有后续读取行\n?
如果我做了一个“tail-f filename”,然后文件会像上面那样更新 tail是继续更新半行,还是只返回原子行 i、 e 我保证在附加1后看到/不看到“lin”吗? 如果“第4行”后面没有\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不能保证原子行,我将不得不对此加以防范(即逐字符读取,然后在看到时识别一行)。根据手册页:
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])