Nohup和Python-u:它仍然没有';t实时记录数据
在后台启动Python进程时,使用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:
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!")