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

标签 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 倍。

最佳答案

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

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

关于Linux:这是并行运行脚本的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1513458/

相关文章:

file - applescript/shell 脚本 - 检查图像

c - 具有可变参数的函数。 open() 是如何工作的?

linux - 如何从内核代码调用内核模块 (LKM) 中定义的函数?

java - websphere 中的自动 Jenkins 部署

c - 奇怪的内存行为处理 TSV

仅当提供参数时,Python 脚本才在 Bash 脚本中返回空字符串

regex - 包含 Perl 一行的 Shell 脚本有空白结果

linux - 写一个shell脚本,在连接丢失时保持重新连接SSH for proxy

svn - 使用 svn log 作为 debian 包变更日志

git - 如何为 git svn clone 选择 --prefix