需要获取rsync备份的实时进度,主要是用到subprocess模块的管道功能。
1 2 3 4
| popen = subprocess.Popen(['ping', 'www.baidu.com', '-n', '3'], stdout = subprocess.PIPE)
while True: print popen.stdout.readline()
|
rsync这种软件的进度是在一行里面实时刷新的,显示进度的缓冲区并没有释放,所以用readline就读不出来,还是得等到整个程序执行结束之后才能返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import subprocess import sys import time import random import os import re
if __name__ == '__main__': cmdLine = [] cmdLine.append('rsync') cmdLine.append('--progress') cmdLine.append('/kvmdata/kvm/VM_winxp/winxp.img') cmdLine.append('/root/winxp.img') tmpFile = "./tmp/%d.tmp" % random.randint(10000,99999) fpWrite = open(tmpFile,'w') process = subprocess.Popen(cmdLine,stdout = fpWrite,stderr = subprocess.PIPE); while True: fpRead = open(tmpFile,'r') lines = fpRead.readlines() for line in lines: print line if process.poll(): break; fpWrite.truncate() fpRead.close() time.sleep(3) fpWrite.close() error = process.stderr.read() if not error == None: print 'error info:%s' % error os.popen('rm -rf %s' % tmpFile) print 'finished'
|
这样就可以实时获取到Rsync的备份进度了