我有一个期望脚本,用于收集交换机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
我需要并行化进程以获得速度,因此我可以攻击每个输入文件的第一行,然后按照循环直到结束。我怎么能做到这一点?
感谢。
答案 0 :(得分:1)
我无法确切地告诉您要做什么,但一般情况下,您可以使用 GNU Parallel 并行化循环,方法是生成并行执行的命令列表并发送它们是 GNU Parallel的标准输入流:
for((i=0;i<${#SW[@]};i++)); do
echo ./ciscoswitches.sh ...
done | parallel
例如,如果要运行8个并行进程而不是每个CPU核心的1个进程标准,则可能需要查看添加-j 8
。此外,也许-k
开关可以保持输出顺序。您还可以标记每个流程的输出。