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

时间:2017-06-21 17:04:30

标签: bash process jobs pid

我试图编写一个脚本,它将并行运行n个并行的进程,这些进程是从主脚本分叉的。运行进程的数量应始终为n,但每个进程的执行时间可能会有所不同。

示例,我使用pid启动三个进程:1,2和3.当三个进程中的一个结束时,我想开始一个新进程。如果2先完成,我将生成关闭进程4,因此正在运行的pid将是:1,3和4。

我已查看使用 wait 命令的其他问题,直到所有作业完成为止。在我的情况下,我不想等到每个工作都完成后才能继续,就在其中一个正在运行的工作完成时。

2 个答案:

答案 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核心的进程,指定并行进程的超时等等。