我正在寻找一种监控Linux上程序写入的文件的方法。我在here中找到了tail -F
命令,并且还建议使用less +FG
。我通过在一个终端中运行tail -F file
和一个简单的python脚本来测试它:
import time
for i in range(20):
print i
time.sleep(0.5)
另一个。我将输出重定向到文件:
python script.py >> file
我希望tail
能够跟踪文件内容并以固定间隔更新显示,而只显示命令终止后写入文件的内容。
同样的事情发生在less +FG
,如果我看cat
的输出。我也尝试使用通常的重定向截断文件>
而不是>>
。这里它表示文件被截断,但仍然没有实时跟踪它。
知道为什么这不起作用? (建议here它可能是由于缓冲写入,但由于我的脚本运行超过10秒,我怀疑这可能不是原因)
编辑:如果重要,我正在运行Linux Mint 18.1
答案 0 :(得分:7)
Python的标准输出是缓冲的。如果关闭脚本/脚本完成后,您会看到所有输出 - 这是一个明确的缓冲区问题。
您可以改用:
import time
import sys
for i in range(20):
sys.stdout.write('%d\n' % i)
sys.stdout.flush()
time.sleep(0.5)
我测试了它并实时打印了值。为了克服缓冲区问题,在每个.write()
方法之后,我使用.flush()
强制"刷新"缓冲区。
评论中的其他选项:
print
语句与sys.stdout.flush()
后跟python -u
的python脚本,用于无缓冲的二进制stdout和stderr 答案 1 :(得分:0)
关于jon1467的答案(抱歉无法评论你的答案),你对重定向的理解是错误的。
试试这个:
dd if=/dev/urandom > test.txt
用文件查看文件大小:
ls -l test.txt
当dd正在运行时,您会看到文件增长。
Vinny的回答是正确的,python标准输出是缓冲的。 您注意到的“缓冲效果”更常见的方法是在Vinny向您展示时刷新标准输出。
你也可以使用-u
选项来禁用整个python进程的缓冲,或者你可以重新打开缓冲区大小为0的标准输出,如下所示(至少在python2中):
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)