并行化流程以提高速度

时间:2016-02-14 18:02:26

标签: bash

我有一个期望脚本,用于收集交换机cisco上的接口。我有一个bash脚本循环。输入文件分为8个部分(sw_aa到sw_ah,每个部分有6行)。

sw_aa
169.254.253.2,169.254.253.1,169.254.253.1,sw_aa
...

sw_ab
169.254.254.2,169.254.254.1,169.254.254.1,sw_ab
...

etc...


loop.sh  
#!/bin/bash
SW=( $(cut -d "," -f 1 sw_??) )
RT=( $(cut -d "," -f 2 sw_??) )
Pre=( $(cut -d "," -f 3 sw_??) )
lote=( $(cut -d "," -f 4 sw_??) )

for((i=0;i<${#SW[@]};i++)); do
 ./ciscoswitches.sh "${SW[$i]} ${RT[$i]} ${Pre[$i]} ${lote[$i]}" >> ${SW[$i]}.log
done

我需要并行化进程以获得速度,因此我可以攻击每个输入文件的第一行,然后按照循环直到结束。我怎么能做到这一点?

感谢。

1 个答案:

答案 0 :(得分:1)

我无法确切地告诉您要做什么,但一般情况下,您可以使用 GNU Parallel 并行化循环,方法是生成并行执行的命令列表并发送它们是 GNU Parallel的标准输入流:

for((i=0;i<${#SW[@]};i++)); do
  echo ./ciscoswitches.sh ...
done | parallel

例如,如果要运行8个并行进程而不是每个CPU核心的1个进程标准,则可能需要查看添加-j 8。此外,也许-k开关可以保持输出顺序。您还可以标记每个流程的输出。