Nohup和Python-u:它仍然没有';t实时记录数据

Nohup和Python-u:它仍然没有';t实时记录数据,python,stdout,nohup,Python,Stdout,Nohup,在后台启动Python进程时,使用 nohup python myscript.py > test.log 2>&1 < /dev/null & 但这还不够。我注意到它在几个小时内工作,然后,它停止工作,即在几个小时后测试。日志不再是实时编写的,即使我使用nohup python-u… 1) 这是如何重现问题的方法(我有一个标准的Debian Jessie)。启动此文件: import time import datetime while True:

在后台启动Python进程时,使用

nohup python myscript.py > test.log 2>&1 < /dev/null &

但这还不够。我注意到它在几个小时内工作,然后,它停止工作,即在几个小时后
测试。日志不再是实时编写的,即使我使用
nohup python-u…

1) 这是如何重现问题的方法(我有一个标准的Debian Jessie)。启动此文件:

import time
import datetime
while True:
    print datetime.datetime.now()
    time.sleep(60)
使用
nohup python-u myscript.py>test.log 2>&1
。 日志文件将在几个小时内更新,然后在3或4小时后,不再更新


2) 如何解决这个问题,而不必在代码中每隔两行插入
stdout.flush()
(丑陋的解决方案)?

如果python-u似乎不适合您,下一个建议是用不缓冲输出的自定义类替换sys.stdout


我不明白为什么python-u不能从您的示例中工作,但这应该可以为您解决这个问题。

有多种处理方法

  • 创建自己的非缓冲输出函数,并使用它而不是print()
  • 导入系统 def日志(msg): 系统标准输出写入(msg) sys.stdout.flush() 日志(“你好,世界!”)
  • 使用mkfifo命令创建您自己的日志记录设备并将其写入,而不是stdout。使用单独的命令将管道从设备传输到文件

  • 直接写入日志文件,并在写入时刷新。与第一个相同,但避免使用stdout。这就是我要做的

  • 我会怀疑诺胡普。终端打开标准i/o流并将其传递给进程。如果您使用nohup运行一个进程,然后注销并关闭终端,我不确定标准流会发生什么。可能是操作系统进行了某种垃圾收集并关闭了它们,使您的进程没有标准输出。你应该考虑写自己的日志。

    import time
    import datetime
    while True:
        print datetime.datetime.now()
        time.sleep(60)
    
    class Unbuffered(object):
        def __init__(self, stream):
            self.stream = stream
        def write(self, data):
            self.stream.write(data)
            self.stream.flush()
        def __getattr__(self, attr):
            return getattr(self.stream, attr)
    
    import sys
    sys.stdout = Unbuffered(sys.stdout)
    print 'Unbuffered Output'
    
    import sys def log(msg): sys.stdout.write(msg) sys.stdout.flush() log("Hello World!")