我正在编写一个备份脚本,我打算每晚在cronjob中执行。
该脚本将sys.stdout和sys.stderr设置为输出文件,以记录发生的情况。
要进行备份,请使用以下代码
cmd = 'rsync -av --del --stats --filter "- .thumbnails/" ' + \
'--filter "- *~" --filter "- *.iso" --filter "- lost+found/" ' + \
'--filter "- .cache/" --filter "- tmp/" --filter "- *.mp3" ' + \
'--filter "- *.log" ' + srcDir + ' ' + dstDir
print "Executing '"+cmd+"' ..."
try:
sys.stdout.flush()
sys.stderr.flush()
retcode = subprocess.call( cmd, stdin = sys.stdin, stdout = sys.stdout,
stderr=sys.stderr, shell=False )
if retcode < 0:
print >>sys.stderr, "Command was terminated by signal", -retcode
elif retcode > 0:
print >>sys.stderr, "Command returned code ", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e
我在子进程调用之前和之后添加print语句。 问题是我在调用之前输出任何打印指令之前得到了子进程调用的输出。我添加了flush()调用,但它没有效果。
为什么会发生这种情况?如何更改此行为?
答案 0 :(得分:3)
我刚在Stackoverflow答案中找到了解决方案here。
替换
sys.stderr = sys.stdout = logFile = open( tmpLogFileName, 'a' )
带
sys.stderr = sys.stdout = logFile = open( tmpLogFileName, 'a', 0 )
这告诉python不要将任何输出缓冲区分配给文件。
答案 1 :(得分:0)
您是否尝试将刷新调用放在try块之外?
答案 2 :(得分:0)
你为什么打印到stderr?如果在写入stderr时子进程正在写入stdout,则可以解释奇数交错。