#!/usr/bin/python

import os,sys,time,re,threading,MySQLdb

now=time.strftime('%Y%m%d')
log_02='/tmp/tongbu_stats_%s.csv' % (now)

dict_cmd={
'test1':'/usr/bin/rsync -tzrlp --stats /tmp/test1 /tmp/test2010',
'test2':'/usr/bin/rsync -tzrlp --stats /tmp/test1 /tmp/test2010',
#'test3':'/usr/bin/rsync -tzrlp --stats /tmp/test1 /tmp/test2010',
}

def write_title(log_stat):
    file_log=open(log_stat,'a')
    file_log.write('start_time,end_time,module,Number of files,Number of files transferred,Total file size(bytes),Total transferred file size(bytes)\n')
    file_log.close()

def write_notes(cmd,log_stat,nam):
    fle=open(log_stat,'a')
# db_conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='test')
# db_curs=db_conn.cursor()
    try:
        s_time=time.strftime('%H:%M:%S')
        cmd_put=os.popen(cmd)
        list_tmp=[]
        re_p=re.compile('(Number of files:|Number of files transferred:|Total file size:|Total transferred file size:) (\d+)?')
        for each_line1 in cmd_put:
            for each_line2 in re_p.finditer(each_line1):
                if each_line2 is not None:
                    list_tmp.append(each_line2.group(2))
                else:
                    pass
        e_time=time.strftime('%H:%M:%S')
    cmd_stat='%s,%s,%s,%s,%s,%s,%s,%s' % (s_time,e_time,nam,list_tmp[0],list_tmp[1],list_tmp[2],list_tmp[3],os.linesep)
        cmd_put.close()
        fle.write(cmd_stat)
        db_curs.execute("INSERT INTO bak_stat \
        (date_ymd,s_time,e_time,mod_name,files,files_traned,filesize,filesize_traned,a_error) VALUES('%s','%s','%s','%s','%s','%s','%s','%s','')" \
        % (now,s_time,e_time,nam,list_tmp[0],list_tmp[1],list_tmp[2],list_tmp[3]) )
    except:
        cmd_stat='%s,%s,%s,%s,%s,%s' % (s_time,e_time,nam,'error','error','error','error'+os.linesep)
        fle.write(cmd_stat)
        db_curs.execute("INSERT INTO bak_stat (date_ymd,s_time,e_time,mod_name,a_error) VALUES('%s','%s','%s','%s','error')" % (now,s_time,e_time,nam) )
    fle.close()
# db_curs.close()
# db_conn.close()

if __name__ == '__main__':
    write_title(log_02)
    db_conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='test')
    db_curs=db_conn.cursor()
    threads = {}
    for i in dict_cmd:
        t=threading.Thread(target=write_notes,args=(dict_cmd[i],log_02,i))
# print 'exec',i
        threads[i]=t
# print threads.items()
    for i in dict_cmd:
        threads[i].start()
        time.sleep(2)
    for i in dict_cmd:
        threads[i].join()
    db_curs.close()
    db_conn.close()

部分代碼解釋:
#!/usr/bin/python
import os,sys,time,re,threading,MySQLdb
now=time.strftime('%Y%m%d')
log_02='/tmp/tongbu_stats_%s.csv' % (now)
dict_cmd={
'test1':'/usr/bin/rsync -tzrlp --stats /tmp/test1 /tmp/test2010',
'test2':'/usr/bin/rsync -tzrlp --stats /tmp/test1 /tmp/test2010',
#'test3':'/usr/bin/rsync -tzrlp --stats /tmp/test1 /tmp/test2010',
}
#執行命令也用字典的形式,“鍵”相當於模塊名,用於標識
def write_title(log_stat):
    file_log=open(log_stat,'a')
    file_log.write('start_time,end_time,module,Number of files,Number of files transferred,Total file size(bytes),Total transferred file size(bytes)\n')
    file_log.close()
def write_notes(cmd,log_stat,nam):
    fle=open(log_stat,'a')
#    db_conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='test')
#    db_curs=db_conn.cursor()
    try:
        s_time=time.strftime('%H:%M:%S')
        cmd_put=os.popen(cmd)
        list_tmp=[]
        re_p=re.compile('(Number of files:|Number of files transferred:|Total file size:|Total transferred file size:) (\d+)?')
#cmd,log_stat,nam為形參,註意區分下面的實參,i
#(\d+)?表示,\d+表示任意數字,至少有一個,
#特殊符號*,+,?它們可以用於匹配字符串模式出現一次、多次、或未出現的情況。
#星號或稱星號操作符匹配它左邊那個正則表達式出現零次或零次以上的情況
#加號(+)操作符匹配它左邊那個正則表達式模式至少出現一次的情況(它也被稱為正閉包操作符)
#問號操作符( ? )匹配它左邊那個正則表達式模式出現零次或一次的情況
 for each_line1 in cmd_put:
            for each_line2 in re_p.finditer(each_line1):
                if each_line2 is not None:
                    list_tmp.append(each_line2.group(2))
                else:
                    pass
#用了兩次循環,第一次把命令結果叠代賦給each_line1變量,第二次,調用正則表達式,把匹配值賦給each_line2變量
#finditer(pattern,string[, flags])在字符串中,查找匹配項,返回叠代器;對於每個匹配,該叠代器返回一個匹配對象。
#避免程序拋出錯誤,增加一個判斷。
        e_time=time.strftime('%H:%M:%S')
 cmd_stat='%s,%s,%s,%s,%s,%s,%s,%s' % (s_time,e_time,nam,list_tmp[0],list_tmp[1],list_tmp[2],list_tmp[3],os.linesep)
        cmd_put.close()
        fle.write(cmd_stat)
        db_curs.execute("INSERT INTO bak_stat \
        (date_ymd,s_time,e_time,mod_name,files,files_traned,filesize,filesize_traned,a_error) VALUES('%s','%s','%s','%s','%s','%s','%s','%s','')" \
        % (now,s_time,e_time,nam,list_tmp[0],list_tmp[1],list_tmp[2],list_tmp[3]) )
    except:
        cmd_stat='%s,%s,%s,%s,%s,%s' % (s_time,e_time,nam,'error','error','error','error'+os.linesep)
        fle.write(cmd_stat)
        db_curs.execute("INSERT INTO bak_stat (date_ymd,s_time,e_time,mod_name,a_error) VALUES('%s','%s','%s','%s','error')" % (now,s_time,e_time,nam) )
#try...except,異常處理
    fle.close()
#    db_curs.close()
#    db_conn.close()
if __name__ == '__main__':
    write_title(log_02)
    db_conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='',db='test')
    db_curs=db_conn.cursor()
#避免MySQL連接的wait_timeout超時,統計數據無法記錄到數據庫中
    threads = {}
    for i in dict_cmd:
        t=threading.Thread(target=write_notes,args=(dict_cmd[i],log_02,i))
#        print 'exec',i
        threads[i]=t
#        print threads.items()
    for i in dict_cmd:
        threads[i].start()
        time.sleep(2)
    for i in dict_cmd:
        threads[i].join()
    db_curs.close()
    db_conn.close()
#創建一個Thread 的實例,傳給它一個函數target,參數args
#threading是多線程
#三個循環,將線程都存在threads{}字典中;依次開始;程序掛起,直到線程結束。

arrow
arrow
    文章標籤
    python rsync
    全站熱搜

    主要步驟 發表在 痞客邦 留言(0) 人氣()