Linux:这是一种并行运行脚本的正确方法吗?

时间:2009-10-03 10:43:22

标签: linux svn bash shell concurrency

我想使用脚本一次更新大量SVN版本的项目。 一个接一个地运行更新作业需要很长时间。

所以我尝试并行运行作业。它似乎工作,但我不确定 如果它正确完成。 也许我没有想到并发问题?

请看一下脚本:

#!/bin/sh

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

    wait
)

当我不先存储输出时,它会全部混淆。

你觉得,这样可以吗?

注意:当没有很多要更新时,40个项目的加速度实际上是20左右。

3 个答案:

答案 0 :(得分:5)

如果两个作业同时完成,您的输出仍然会混淆。您最好将输出写入文件,然后在运行结束时捕获文件:

#!/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个目录,我认为这不是一个问题。

答案 1 :(得分:1)

是的,除非采取特殊预防措施(例如将输出存储在您的情况下),否则输出在并行执行期间会混淆。

控制台不会等待命令的整个输出出现。请注意,当您运行svn update而没有任何并行时,这些行将逐个打印,因为Subversion会提取并合并文件。因此,当两个svn调用同时工作时,每个调用都要逐个打印,输出是由它们打印的行的混合。

答案 2 :(得分:0)

应该没问题。进行这种并发更新时,您的硬盘是否会破坏很多?如果您需要进行大量更改,可能会更新。