【问题标题】:capturing stdout from python in an upstart job在新贵工作中从 python 捕获标准输出
【发布时间】:2011-11-28 18:03:39
【问题描述】:

当我将 python2.6 脚本的标准输出输出作为新贵作业运行时,我正在努力将其保存到文件中。

这是我当前的测试脚本:

#!/usr/bin/python
from time import sleep
import sys

while 1:
    print "Hello from stdout"
    print >> sys.stderr, "Hello from stderr"
    sleep(1)

如果我这样做 $ myscript >> /var/log/myscript 效果很好。我都看到了。

不过,作为一个暴发户脚本,如果我使用如下配置

  1. /etc/init/myscript.conf:

    exec /path/to/myscript >> /var/log/myscript 2>&1
    

    我看到了:

    Hello from stderr
    Hello from stderr
    Hello from stderr
    Hello from stderr
    Hello from stderr
    Hello from stderr
    

如果我为 stderr 和 stdout 使用不同的文件,它们都会被创建,但 stdout 始终为空。

我做错了什么?

【问题讨论】:

    标签: python stdout upstart


    【解决方案1】:

    缓冲和刷新是猜测。

    stderr 通常是无缓冲的流,而 stdout 是缓冲的。当您将其发送到文件时,它将被缓冲为 4k 块(通常)。

    如果您进行以下更改:

    while 1:
        print "hello from stdout"
        sys.stdout.flush()
        print >> sys.stderr, "Hello from stderr"
        sleep(1)
    

    您应该会在文件中看到输出。

    【讨论】:

    • 我认为这可能是一个缓冲问题。我曾假设当 python 收到 SIGTERM 时,它会自行刷新标准输出。我想一个潜在的解决方案是捕获 SIGTERM 并在那时刷新缓冲区。
    • 是的,用 flush() 处理 sigterm 会得到你想要的。如果未处理 TERM 将终止程序,但有趣的想法是让默认处理程序刷新所有 IO...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 2011-07-05
    • 2013-05-10
    • 2011-11-28
    • 1970-01-01
    相关资源
    最近更新 更多