Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何生成n个进程并在一个进程使用完bash后启动另一个进程?_Bash_Process_Jobs_Pid - Fatal编程技术网

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

如何生成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` 似乎能胜任这项工作。感谢

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

例如,我使用pid启动三个进程:1、2和3。当三个过程中的一个结束时,我想开始一个新的过程。如果2首先完成,我将生成进程4,这样运行的pid将是:1、3和4

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

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