2009-10-03 110 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