tail和less命令不实时监视文件

时间:2017-09-19 12:33:10

标签: python linux bash shell

我正在寻找一种监控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

2 个答案:

答案 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)