2012-01-26 61 views
3

我正在創建一個使用子進程運行rsync的python腳本,然後獲取stdout並將其打印出來。 運行該腳本使用此代碼對conf文件多張rsync的過程基地:在foreach循環中運行多個子進程?一次?

for share in shares.split(', '): 
    username = parser.get(share, 'username') 
    sharename = parser.get(share, 'name') 
    local = parser.get(share, 'local') 
    remote = parser.get(share, 'remote') 
    domain = parser.get(share, 'domain') 
    remotedir = username+"@"+domain+":"+remote 
    rsynclog = home + "/.bareshare/"+share+"rsync.log" 
    os.system("cp "+rsynclog+" "+rsynclog+".1 && rm "+rsynclog) # MOve and remove old log 
    rsync="rsync --bwlimit="+upload+" --stats --progress -azvv -e ssh "+local+" "+username+"@"+domain+":"+remote+" --log-file="+rsynclog+" &" 
    # Run rsync of each share 
    #   os.system(rsync) 
    self.rsyncRun = subprocess.Popen(["rsync","--bwlimit="+upload,"--stats","--progress","-azvv","-e","ssh",local,remotedir,"--log-file="+rsynclog], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

我thinkg,這未必是最好的事情 - 在森那時間運行多個同步。我怎麼能設置這個,讓我等待一個過程在下一個過程開始之前完成?

你可以找到我這裏完整的腳本:https://github.com/danielholm/BareShare/blob/master/bareshare.py

編輯:我如何讓完成後self.rsyncRun死嗎?當rsync與所有文件完成時,它似乎仍然繼續,儘管它不應該這樣做。

+0

檢查出['Queue'(HTTP://文檔。 python.org/library/queue.html)模塊。 – aganders3

回答

4

調用

self.rsyncRun.communicate() 

將阻塞的主要過程,直到rsyncRun過程已經完成。


如果你不希望主進程阻塞,然後產生一個線程來處理呼叫subprocess.Popen

import threading 

def worker(): 
    for share in shares.split(', '): 
     ... 
     rsyncRun = subprocess.Popen(...) 
     out, err = rsyncRun.communicate() 

t = threading.Thread(target = worker) 
t.daemon = True 
t.start() 
t.join() 
+0

對不起,我不想讓主進程等待,只是rsync進程等待對方。 –

+0

你可以使用線程模塊產生一個線程來處理對'subprocess.Popen'的調用。然後你可以在線程中調用'self.rsyncRun.communicate()'而不阻塞主進程。 – unutbu

+0

所以,我已經添加了這個功能,但我不知道如何從命令中獲得輸出? –