2011-11-28 60 views
2

我努力将python2.6脚本的标准输出保存到文件中,当我将它作为新贵的作业运行时。在暴发的作业中从python捕获标准输出

这是我目前的测试脚本:

#!/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工作正常。我看到两者。

然而,作为新贵的脚本,如果我用下面的conf

  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文件,它们都创建,但标准输出始终为空。

我在做什么错?

回答

3

缓冲和冲洗将是猜测。

stderr通常是一个无缓冲流,而stdout是缓冲的。当你将它发送到一个文件时,它将被缓存在4k块(通常)中。

如果您做如下改变:

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

你应该看到输出文件。

+0

我认为这可能是一个缓冲问题。我曾假设当python收到一个SIGTERM时,它会自己刷新stdout。 我想一个潜在的解决方案是捕获SIGTERM并刷新缓冲区。 – rod

+0

是的,用flush()处理sigterm会得到你想要的。一个TERM如果没有处理将终止该程序,但有趣的想法是让默认处理程序刷新所有IO ... – koblas