带有sleep()语句的Python脚本在后台运行时不会记录

时间:2011-10-07 10:47:42

标签: python bash shell

我有一个简单的Python脚本,我想在后台运行,输出重定向到一个文件,例如。

./test.py > output.log 2>&1 &

只要我的Python脚本中没有sleep语句,这就可以正常工作:

#! /usr/bin/env python

import sys
import time
from time import gmtime, strftime

urls=['http://a', 'http://b','http://c', 'http://d', 'http://e' ]

def main():
    while True:
        for url in urls:
            try:
                print url
            except Exception, e:
                print "Error checking url " + url
                print e
        #time.sleep(60)


if __name__ == '__main__':
    main()

如果取消注释sleep语句,则在后台运行脚本时不会生成任何输出。

如果它在前台运行它可以正常工作(带睡眠),输出会按照我的选择发送到控制台或文件。

e.g。这总是有效:

./test.py > output.log

我的问题是,当脚本在后台运行时,为什么让sleep语句阻止输出被定向到文件,我该如何绕过它呢?

2 个答案:

答案 0 :(得分:3)

输出不会丢失,只需要很长时间才能到达文件。这与缓冲有关:使用sleep输出缓冲区需要很长时间才能累积足够的数据来刷新。

如果您在致电sys.stdout.flush()之前致电sleep(),则会立即显示输出:

    sys.stdout.flush()
    time.sleep(60)

答案 1 :(得分:1)

我还没有尝试,但您可以在发送脚本进入睡眠状态之前尝试使用sys.stdout.flush()