包含sleep()语句的Python脚本在后台运行时不记录日志

2 投票
2 回答
1129 浏览
提问于 2025-04-17 03:51

我有一个简单的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语句打开,那么当我在后台运行这个脚本时,就不会生成任何输出。

如果在前台运行,它就没问题(有sleep的情况下),输出会按照我的选择显示在控制台或文件里。

比如,这种情况总是能正常工作:

./test.py > output.log

我想问的是,为什么在后台运行脚本时,加入sleep语句会导致输出无法保存到文件里,我该怎么解决这个问题呢?

2 个回答

1

我还没试过,不过你可以试试在让你的脚本暂停之前,先用 sys.stdout.flush() 这个命令。

4

输出并没有丢失,只是到达文件的时间很长。这跟缓冲有关:因为有了sleep,输出缓冲区需要很长时间才能积累足够的数据,然后才会被写入文件。

如果你在调用sleep()之前先调用sys.stdout.flush(),那么输出就会立刻显示出来:

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

撰写回答