如何生成n个进程并在一个进程使用完bash后启动另一个进程?
我正在尝试编写一个脚本,它将并行运行n个进程,这些进程是从主脚本派生出来的。正在运行的进程数应始终为n,但每个进程的执行时间可能会有所不同 例如,我使用pid启动三个进程:1、2和3。当三个过程中的一个结束时,我想开始一个新的过程。如果2首先完成,我将生成进程4,这样运行的pid将是:1、3和4 我查看了其他问题,其中使用wait命令直到所有作业完成。在我的例子中,我不想等到每一个作业都完成后才继续,就在其中一个正在运行的作业完成时如何生成n个进程并在一个进程使用完bash后启动另一个进程?,bash,process,jobs,pid,Bash,Process,Jobs,Pid,我正在尝试编写一个脚本,它将并行运行n个进程,这些进程是从主脚本派生出来的。正在运行的进程数应始终为n,但每个进程的执行时间可能会有所不同 例如,我使用pid启动三个进程:1、2和3。当三个过程中的一个结束时,我想开始一个新的过程。如果2首先完成,我将生成进程4,这样运行的pid将是:1、3和4 我查看了其他问题,其中使用wait命令直到所有作业完成。在我的例子中,我不想等到每一个作业都完成后才继续,就在其中一个正在运行的作业完成时 wait -n `jobs -p` 似乎能胜任这项工作。感谢
wait -n `jobs -p`
似乎能胜任这项工作。感谢l'l'l和hek2mgl的指导。除了使用wait等,如果您不介意突破纯bash内置并安装包,还可以使用gnu信号量/并行实现强大的作业控制
# 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
#输出:
它还可以控制每个CPU内核的进程,指定并行进程的超时等您仍然可以使用wait命令,直到找到一个进程,然后继续…我假设等待将阻塞,直到所有进程完成。
wait
内置有多种操作模式。在bash中键入help wait
,但不知道wait-n
选项。谢谢@l'l'l和@hek2mgl
Start 1
Start 2
Start 3
1 done
Start 4
2 done
3 done
4 done