我试图编写一个脚本,它将并行运行n个并行的进程,这些进程是从主脚本分叉的。运行进程的数量应始终为n,但每个进程的执行时间可能会有所不同。
示例,我使用pid启动三个进程:1,2和3.当三个进程中的一个结束时,我想开始一个新进程。如果2先完成,我将生成关闭进程4,因此正在运行的pid将是:1,3和4。
我已查看使用 wait 命令的其他问题,直到所有作业完成为止。在我的情况下,我不想等到每个工作都完成后才能继续,就在其中一个正在运行的工作完成时。
答案 0 :(得分:1)
wait -n `jobs -p`
似乎可以胜任这项工作。感谢l'L'l和hek2mgl的指导。
答案 1 :(得分:0)
除了使用wait等,你可以使用gnu信号量/并行来实现强大的作业控制,如果你不介意打破纯粹的bash内置和安装包。
# sem can emulate a counting semaphore. Use --jobs to set the number of toilets like this:
sem --jobs 3 --id my_id -u 'echo Start 1; sleep 5; echo 1 done' &&
sem --jobs 3 --id my_id -u 'echo Start 2; sleep 6; echo 2 done' &&
sem --jobs 3 --id my_id -u 'echo Start 3; sleep 7; echo 3 done' &&
sem --jobs 3 --id my_id -u 'echo Start 4; sleep 8; echo 4 done' &&
sem --wait --id my_id
#输出:
Start 1 Start 2 Start 3 1 done Start 4 2 done 3 done 4 done
https://www.gnu.org/software/parallel/parallel_tutorial.html
它还可以控制每个CPU核心的进程,指定并行进程的超时等等。