【问题标题】:shell script, for loop, does loop wait for execution of the command to iterateshell脚本,for循环,循环等待命令的执行进行迭代
【发布时间】:2015-08-20 05:34:35
【问题描述】:

我有一个带有 for 循环的 shell 脚本。循环是否在迭代之前等待其主体中的命令执行?

提前致谢

这是我的代码。命令是顺序执行还是并行执行?

for m in "${mode[@]}" 
    do 
        cmd="exec $perlExecutablePath $perlScriptFilePath --owner $j -rel $i -m $m"
        $cmd
        eval "$cmd"
    done

【问题讨论】:

    标签: bash shell for-loop exec


    【解决方案1】:

    假设你没有后台编辑命令,那么是的。

    例如:

    for i in {1..10}; do cmd; done
    

    在继续循环之前等待cmd 完成,而:

    for i in {1..10}; do cmd &; done
    

    没有。

    如果你想并行运行你的命令,我建议你把你的循环改成这样:

    for m in "${mode[@]}" 
    do 
        "$perlExecutablePath" "$perlScriptFilePath" --owner "$j" -rel "$i" -m "$m" &
    done
    

    这会在后台运行每个命令,因此它不会在下一个命令开始之前等待一个命令完成。

    另一种方法是查看专为此目的设计的GNU Parallel

    【讨论】:

    • 感谢汤姆的努力
    【解决方案2】:

    使用 GNU Parallel 它看起来像这样:

    parallel $perlExecutablePath $perlScriptFilePath --owner $j -rel $i -m {} ::: "${mode[@]}" 
    

    GNU Parallel 是一种通用的并行化器,可以轻松地在同一台机器上或在您可以通过 ssh 访问的多台机器上并行运行作业。它通常可以替换 for 循环。

    如果您想在 4 个 CPU 上运行 32 个不同的作业,那么并行化的直接方法是在每个 CPU 上运行 8 个作业:

    GNU Parallel 会在完成后生成一个新进程 - 保持 CPU 处于活动状态,从而节省时间:

    安装

    如果没有为您的发行版打包 GNU Parallel,您可以进行个人安装,这不需要 root 访问权限。这样做可以在 10 秒内完成:

    (wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
    

    有关其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README

    了解详情

    查看更多示例:http://www.gnu.org/software/parallel/man.html

    观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

    浏览教程:http://www.gnu.org/software/parallel/parallel_tutorial.html

    注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 2015-07-02
      相关资源
      最近更新 更多