如何生成 n 个进程并在一个进程使用完 bash 后启动另一个进程?

How to spawn n processes and start another after one finishes using bash?

我正在尝试编写一个脚本,它将 运行 n 个从主脚本派生的并行进程。 运行ning 进程的数量应始终为 n,但每个进程的执行时间可能会有所不同。

例如,我启动了 pid 为 1、2 和 3 的三个进程。当这三个进程之一结束时,我想启动一个新进程。如果 2 先完成,我将生成进程 4,因此 运行ning pid 将是:1、3 和 4。

我查看了其他问题,其中使用 wait 命令直到所有作业完成。在我的例子中,我不想等到每个工作都完成后才能继续,就在 运行ning 工作之一完成时。

wait -n `jobs -p`

似乎可以胜任。感谢 l'L'l 和 hek2mgl 的指导。

除了使用 wait 等之外,如果您不介意脱离纯 bash 内置函数并安装软件包,您还可以使用 gnu semaphore/parallel 实现强大的作业控制。

# 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

# Output:

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 个内核的进程,为并行进程指定超时等