并行运行BASH中的N个过程批次

时间:2017-02-01 19:51:26

标签: bash parallel-processing wait sleep

我有一个for循环,我希望一次并行处理它4次。 我尝试了https://unix.stackexchange.com/questions/103920/parallelize-a-bash-for-loop页面中的以下代码:

task(){
sleep 0.5; echo "$1";
}
N=4
(
for thing in a b c d e f g; do
   ((i=i%N)); ((i++==0)) && wait
   task "$thing" &
done
)

我已将上述文件存储为test.sh,我得到的输出如下:

path$ ./test.sh
a
b
c
d
path$ e
f
g

光标没有回到我的终端后,它会无限期地等待/睡觉。我希望光标回到我的终端而且我也不明白为什么输出' e'我的路径在它前面,不应该输出显示为' a'到了'不断,代码应该停止?

2 个答案:

答案 0 :(得分:3)

很难理解你想要什么,但我认为你想做7件事,称为abc ... {{1并行,一次不超过4个实例。

如果是这样,你可以试试这个:

g

echo {a..g} | xargs -P4 -n1 bash -c 'echo "$1"; sleep 2' {} .. a发送到g,然后为每个字母开始一个新的xargs shell,传递一个字母(bash)作为-n1的shell。 {} shell获取参数(其第一个参数为bash)并回送它然后在退出前等待2秒 - 这样您就可以看到暂停。

$1告诉-P4一次同时运行4个xargs个实例。

这是一个关于它运行的小视频。第一个使用bash并以4个为一组运行,第二个序列使用-P4并一次执行2个:

enter image description here

或者更简单地说,如果您不介意花10秒钟安装 GNU Parallel

-P2

答案 1 :(得分:0)

如果按下输入玩具可以看到比你正常的外壳。如果要在退出脚本之前等待批处理进程,只需在脚本末尾添加wait