Shell脚本运行多个文件

时间:2018-12-24 06:48:42

标签: bash shell parallel-processing

我想在并行运行100个文件的for循环中使用shell脚本。

当前,我有以下格式的shell脚本:

#!/bin/bash
NUM=10
python a1.py $((NUM + 0)) &
python a2.py $((NUM + 2)) &
python a3.py $((NUM + 4)) &
python a4.py $((NUM + 6)) &
python a5.py $((NUM + 8)) &

现在,如果我有a1.pya2.pya3.py .... a100.py,并且想并行运行它们,该如何做for循环?

2 个答案:

答案 0 :(得分:4)

如果您拥有bash第4版并运行此程序:

echo {10..208..2} 

您将获得:

10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60
62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 
110 112 114 116 118 120 122 124 126 128 130 132 134 136 138 140 142 144 146 
148 150 152 154 156 158 160 162 164 166 168 170 172 174 176 178 180 182 184 
186 188 190 192 194 196 198 200 202 204 206 208

看起来像您的系列。然后,如果您想并行运行许多作业,则可以使用 GNU Parallel 。这为您提供{#}作为职位编号的占位符。因此,如果运行此命令:

parallel -k echo {#} {} ::: {10..208..2}

您将获得:

1 10
2 12
3 14
4 16
5 18

因此,要运行实际的脚本,例如:

parallel -k --dry-run 'python a{#}.py {}' ::: {10..208..2}

示例输出

python a1.py 10
python a2.py 12
python a3.py 14
python a4.py 16
...
...

如果看起来不错,请在没有--dry-run-k的情况下再次运行,后者会保留输出以便于调试。

TLDR;

对于 GNU Parallel ,我最简洁的回答是:

parallel python a{#}.py {} ::: {10..208..2}

或者如果您没有bash版本4:

parallel python a{#}.py {} ::: $(seq 10 2 208)

答案 1 :(得分:1)

NUM=10
for ((i=0; i<100; i++)); do echo python a$(($i+1)).py $(($NUM+$i*2)); done

输出:

python a1.py 10
python a2.py 12
python a3.py 14
.
.
.
python a98.py 204
python a99.py 206
python a100.py 208

如果这样可以,请使用:

NUM=10
for ((i=0; i<100; i++)); do python a$(($i+1)).py $(($NUM+$i*2)) & done