使用脚本运行有限数量的并行程序

基于此解决scheme,我正在尝试开发一个脚本,将运行的进程数量限制为4.但是作为替代,我希望作业存储在通过索引引用的数组中。 我写了以下内容:

todo_array[1]="echo start1;sleep 3;echo done1" todo_array[2]="echo start2;sleep 3;echo done2" todo_array[3]="echo start3;sleep 3;echo done3" todo_array[4]="echo start4;sleep 3;echo done4" todo_array[5]="echo start5;sleep 3;echo done5" todo_array[6]="echo start6;sleep 3;echo done6" todo_array[7]="echo start7;sleep 3;echo done7" todo_array[8]="echo start8;sleep 3;echo done8" todo_array[9]="echo start9;sleep 3;echo done9" max_jobs=4 seq ${#todo_array[@]} | xargs -i --max-procs=$max_jobs bash -c $todo_array[{}] 

但是当我执行我得到一个空的9 newlinex输出。 我究竟做错了什么? 谢谢

编辑 :我修改它

 seq ${#todo_array[@]} | xargs -i --max-procs=$max_jobs bash -c "$todo_array[{}]" 

我得到以下奇怪的输出:

 start1 start1 start1 start1 done1[2] done1[3] done1[1] done1[4] start1 start1 start1 start1 done1[5] done1[6] done1[7] done1[8] start1 done1[9] 

试试这个:

 #!/bin/bash todo_array[1]="echo start1;sleep 3;echo done1" todo_array[2]="echo start2;sleep 3;echo done2" todo_array[3]="echo start3;sleep 3;echo done3" todo_array[4]="echo start4;sleep 3;echo done4" todo_array[5]="echo start5;sleep 3;echo done5" todo_array[6]="echo start6;sleep 3;echo done6" todo_array[7]="echo start7;sleep 3;echo done7" todo_array[8]="echo start8;sleep 3;echo done8" todo_array[9]="echo start9;sleep 3;echo done9" max_jobs=4 for i in "${todo_array[@]}" do echo $i done | xargs -IX --max-procs=$max_jobs bash -c "X" 

如果你的问题不是教育性的,而只是“如何运行有限数量的并行程序”,我的建议是不使用脚本,重新发明轮子,而是使用GNU并行,而这正是为此目的而设计的。

只需使用您的命令创建一个脚本,并将其并入即可

 ./myScript.sh | parallel -j2 

在这个例子中,并行将并行运行两个作业,但是会在最后收集脚本的输出,就像您实际上一个接一个地执行脚本一样。 当然,这些任务应该是独立的。 这个问题目前还不清楚。

你可能有兴趣检查ppss 。 这是一个很容易使用强大的threader脚本/外壳的东西。