2009-10-03 76 views
1

我想使用腳本一次更新大量SVN版本的項目。 逐個運行更新作業需要很長時間。Linux:這是並行運行腳本的正確方法嗎?

所以我試圖並行運行作業。它似乎工作,但我不知道如果它正確完成 。 也許有沒有想到的併發問題?

請看看腳本:

#!/bin/sh 

time (
    for f in `ls -d */` 
    do 
     (
      OUTPUT=`svn update $f` 
      echo -e "= = = = = = = = = = $f \n$OUTPUT" 
     ) & 
    done 

    wait 
) 

當我不先存儲輸出,它涉及全部混合起來。

你覺得,這樣可以嗎?

注意:在沒有更新的情況下,加速對於40個項目來說實際上是20因子。

+0

嗯,我不確定,現在是什麼? ** Pavel Shved **或** ijw **的答案? – 2009-10-03 11:13:39

回答

0

應該沒問題。進行這種併發更新時,硬盤是否會出現很多悸動現象?如果你有很多更新需要更新,可能會出現這種情況。

+0

之後我做了一個同步,有時需要10秒;) – 2009-10-03 11:08:28

1

是的,可以在並行執行期間將輸出混合起來,除非採取了特殊的預防措施(如存儲輸出)。

控制檯不會等待命令的整個輸出顯示。請注意,當您運行svn update而沒有任何並行操作時,會逐行打印這些行,因爲Subversion會提取併合並這些文件。因此,當兩個svn調用同時工作時,每個svn調用都希望逐一打印,而輸出是由它們打印的行的混合。

5

如果兩個工作同時完成,您的輸出仍然會混淆在一起。你會更好寫輸出到文件,然後cat'ting文件在運行結束:

#!/bin/sh 
outdir="/tmp/output$$" # probably ought to be chosen with e.g. mktemp 

trap 'rm -rf "$outdir"' EXIT # Clean up on exit, even if Ctrl-C 

time (
    mkdir "$outdir" 
    for f in `ls -d */` # You have issues with filenames with space in, here 
    do 
      (
        echo -e "= = = = = = = = = = $f" 
        svn update "$f" 
      ) > "$outdir/$f" & 
    done 

    wait 
    cat "$outdir"/* 
) 

除此之外,我所關心的是,你沒有限制的作業數你明確運行,但在shell腳本中很難實現。假如你有信心看到40個目錄,而不是10,000個,我不認爲這是一個太大的問題。

+0

那麼,你指的是,那兩個打印大量文本的「併發」回顯命令可能被控制檯混淆了? – 2009-10-03 11:11:27

+0

是的。我不認爲'回聲'是原子的。也就是說,我剛剛用1MB文件運行的一個快速測試表明它可能足夠接近原子以至於你不在意... – ijw 2009-10-03 11:16:03

+0

不,回聲不是原子的。你有N個進程都與STDOUT連接到相同的文件描述符(shell腳本的STDOUT)。上面的示例在啓動之前將與子外殼中的STDOUT相關聯的文件描述符改變,因此每個echo命令都有自己的句柄。 – dannysauer 2009-10-06 16:57:57