wre*_*rek 6 parallel-processing bash shell
我想在for循环中使用shell脚本,并行运行100个文件.
目前,我有一个以下格式的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)) &
Run Code Online (Sandbox Code Playgroud)
现在,如果我有a1.py,a2.py,a3.py... ... a100.py,我想并行运行它们,我怎么做,在for循环?
如果您有bash版本 4 并运行以下命令:
echo {10..208..2}
Run Code Online (Sandbox Code Playgroud)
你会得到这个:
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
Run Code Online (Sandbox Code Playgroud)
这看起来像你的系列。然后,如果您想并行运行大量作业,我会使用GNU Parallel。这为您提供了{#}职位编号的占位符。所以,如果你运行这个:
parallel -k echo {#} {} ::: {10..208..2}
Run Code Online (Sandbox Code Playgroud)
你会得到这个:
1 10
2 12
3 14
4 16
5 18
Run Code Online (Sandbox Code Playgroud)
因此,要运行实际的脚本,例如:
parallel -k --dry-run 'python a{#}.py {}' ::: {10..208..2}
Run Code Online (Sandbox Code Playgroud)
样本输出
python a1.py 10
python a2.py 12
python a3.py 14
python a4.py 16
...
...
Run Code Online (Sandbox Code Playgroud)
如果看起来不错,请在不带--dry-run和不带 的情况下再次运行-k,这会保留输出,以便更容易调试。
太长了;
我对GNU Parallel最简洁的回答是:
parallel python a{#}.py {} ::: {10..208..2}
Run Code Online (Sandbox Code Playgroud)
或者,如果您没有bash版本 4:
parallel python a{#}.py {} ::: $(seq 10 2 208)
Run Code Online (Sandbox Code Playgroud)