![如何运行 `$(nproc)`× `openssl dhparam` 的并行实例,并且当第一个实例以 `0` 退出时,杀死其他实例?](https://linux22.com/image/221169/%E5%A6%82%E4%BD%95%E8%BF%90%E8%A1%8C%20%60%24(nproc)%60%C3%97%20%60openssl%20dhparam%60%20%E7%9A%84%E5%B9%B6%E8%A1%8C%E5%AE%9E%E4%BE%8B%EF%BC%8C%E5%B9%B6%E4%B8%94%E5%BD%93%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%AE%9E%E4%BE%8B%E4%BB%A5%20%600%60%20%E9%80%80%E5%87%BA%E6%97%B6%EF%BC%8C%E6%9D%80%E6%AD%BB%E5%85%B6%E4%BB%96%E5%AE%9E%E4%BE%8B%EF%BC%9F.png)
我正在运行openssl dhparam -out dhparam4096.pem 4096
,它在任务持续时间内将单个核心固定在 100%(这在某些处理器上可能相当大)。我有 1 个或多个基本上处于空闲状态的附加核心,我想使用它们。
我想运行$(nproc)
该命令的 × 个实例。不同的是,我不需要完成所有实例 - 只需要第一个退出的实例......一旦“获胜者”实例完成,0
其余进程就应该是“d”或类似的,它不需要很优雅。SIGTERM
我正在学习parallel
并xargs
实现这一目标,有许多指导文章可以完成全部并行任务,但我无法在搜索引擎上实现上述目标。我不喜欢使用parallel
or的想法xargs
,我有并行替代方案一旦我找到了阅读方式,就将其添加到我的阅读列表中。
如何运行$(nproc)
命令的 × 个实例,其中第一个退出的实例0
将杀死其他实例?
其他信息:Debian 11、aarch64 bash
、.
答案1
在交互式 shell 的提示下zsh
:
(repeat $(nproc) { {your-command && kill 0} & }; wait)
将在新进程组中运行该子 shell,your-command
成功退出的第一个实例会触发kill 0
杀死该进程组。
parallel
您可以对from执行相同的操作moreutils
:
parallel sh -c 'your-command && kill 0' -- {1..$(nproc)}
({1..5}
,来自 zsh ,现在被许多其他 shell 甚至 bash 支持,但在 bash 中你不能在其中使用扩展,$(seq "$(nproc)")
假设未修改,你总是可以替换为$IFS
)。
或者使用 GNU xargs
:
seq "$(nproc)" | xargs -P0 -n1 sh -c '
your-command && kill 0'
或者将每个作业显式绑定到每个 CPU:
seq 0 "$(( $(nproc) - 1))" | xargs -P0 -ICPU taskset -c CPU sh -c '
your-command && kill 0' sh-on-cpuCPU
每次的关键是在交互式 shell 的提示符下运行它,以便所有命令都放在自己的进程组中。
答案2
如果您的核心数少于 10000:
seq 10000 | parallel -N0 --halt now,success=1 openssl dhparam -out dhparam4096.pem 4096