如何生成 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 个内核的进程,为并行进程指定超时等
我正在尝试编写一个脚本,它将 运行 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 个内核的进程,为并行进程指定超时等