【问题标题】:How come I can't tail my log?为什么我不能跟踪我的日志?
【发布时间】:2013-06-04 07:25:33
【问题描述】:

在我的 python 脚本中,我有这个:

count = 0
while 1:
    print count
    count += 1

我保存了这个文件并运行了它。

nohup python count.py >> test.log &

$tail -f test.log 

当我尾随它时什么都没有显示。

【问题讨论】:

  • 我运行了你的脚本并做了一个尾巴......它工作得很好。你还有其他事情要发生。

标签: python linux ubuntu logging


【解决方案1】:

当您重定向 Python 输出时,stdout 流以缓冲模式(而不是行缓冲模式)打开。这意味着输出将保留在内存中,直到在刷新缓冲区之前打印了足够多的行。

要立即查看行,您需要刷新输出流:

import sys

count = 0
while 1:
    print count
    sys.stdout.flush()
    count += 1

或者,使用-u 命令行开关强制无缓冲 I/O:

nohup python -u count.py >> test.log &

或者您可以使用PYTHONUNBUFFERED 环境变量:

PYTHONUNBUFFERED=1 nohup python count.py >> test.log &

或在无缓冲模式下重新打开stdout 文件句柄:

import os
import sys

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

在 Python 3.3 及更高版本中,这一切都简单一些;你只需告诉print() 刷新:

print(count, flush=True)

【讨论】:

  • 可能还有一种方法可以使写入无缓冲,但我不知道 python。
  • 但是脚本打印了大量的信息。输出缓冲区经常被刷新,它应该可以拖尾。缓冲通常对系统性能有好处 - 这就是为什么它是默认设置。
  • @tdelaney:是的,我非常同意;这就是我首先提出.flush() 选项的原因;你至少可以控制冲洗的频率。
【解决方案2】:

这是因为默认情况下对标准输出的写入是缓冲的。在缓冲区填满或文件描述符被刷新或关闭之前,您将什么也看不到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多