【问题标题】:Executing a for loop with gnu parallel使用 gnu 并行执行 for 循环
【发布时间】:2017-11-25 07:39:26
【问题描述】:

我想使用 gnu 并行在 for 循环中的 bash 脚本中执行一个函数,但我无法从我上网的信息中弄清楚如何。 例如:

#!/bin/bash

get_racks(){
query that outputs a list of racks 
}

get_hosts() {
query that outputs a list of hosts by rack(passed as param to the func)
}

get_gw() {
query that outputs a list of gateways
}

check_ping() {
HOSTS=(`get_hosts`)
COUNTER=0
while [ $COUNTER -lt $SIZE ] ; do
  ssh $HOSTS "ping -c 5 ${GATEWAYS[$COUNTER]} " ;
  COUNTER=$((COUNTER+1)) ;
done
}

RACKS=(`get_racks`)
HOSTS=(`get_hosts`)
GWS=(`get_gw`)
SIZE=${#GWS[@]}
COUNTER=0

for rack in ${RACKS[@]}; do
  parallel check_ping | tee output.txt 
done

我想并行执行 for 循环和内部发生的事情,同时控制并发作业的数量并将所有内容输出到单个文件中。最终文件应该包含函数返回的所有数据并打印到 stdout 。 此外,check_ping 有一部分 ssh 到远程机器并 ping GW,这部分实际上与自定义 ssh 命令并行发生,我们将 ssh 并行到阵列中的所有主机并 ping GW。

非常感谢

【问题讨论】:

    标签: linux bash shell parallel-processing scripting


    【解决方案1】:

    我想你想要这个:

    RUN_COMMANDS() {
    ...
    }
    
    export -f RUN_COMMANDS
    
    parallel -j4 RUN_COMMANDS ::: “${FILES[@]}” | tee output.txt
    

    如果订单很重要,你会想要parallel -k ...

    【讨论】:

    • 糟糕,这里加个空格RUN_COMMANDS() {
    • 对不起,这是我的伪代码中的语法错误,实际代码很好。我仍然收到此错误
    • 我猜你真的在用bash?
    • 如果您仍然遇到错误,请点击原始问题下方的edit 并粘贴您的实际代码和实际错误,以便人们进一步帮助您。
    • 你需要export -f check_pingparallel ...之前几行
    【解决方案2】:
    #!/bin/bash
    
    get_racks(){
        # query that outputs a list of racks
        echo rack01
    }
    export -f get_racks
    
    get_hosts() {
        # query that outputs a list of hosts by rack(passed as param to the func)
        echo host01
        echo host02
    }
    export -f get_hosts
    
    get_gw() {
        # query that outputs a list of gateways
        echo gw1
        echo gw2
    }
    export -f get_gw
    
    ping_gw() {
        rack="$1"
        get_hosts "$rack" | parallel -S - --onall ping -c 5 ::: "`get_gw`"
    }
    export -f ping_gw
    get_racks | parallel ping_gw && echo All hosts and gws are up
    

    如果您有更多函数/变量/别名,请考虑改用env_parallel。这样env_parallel 就会为您导出。

    【讨论】:

    • 感谢@OleTange 的回答,但我得到了/bin/bash: ping gw : command not found。我在另一个线程中读到,您说这可能是由于并行版本的错误?
    • 您是在复制全文吗?自 2014 年以来,我刚刚测试了 GNU Parallel 的所有版本。它们都可以工作。这不太可能是 GNU Parallel 中的错误。
    • 是的,仍然返回 command not found 。我以普通用户帐户的身份运行它。
    • 您的环境中很可能出现了问题。看看您是否可以在其中任何一个上重现错误:sourceforge.net/projects/virtualboximage/files
    【解决方案3】:

    Parallel 的使用方式与 xargs 非常相似,它甚至还实现了 xargs 的参数。

    #!/bin/bash
    
    RUN_COMMANDS(){
        ...... 
    }
    
    FILES=(file1 file2 file3)
    
    echo ${FILES[@]} | parallel RUN_COMMANDS | tee output.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多