如何运行 `$(nproc)`× `openssl dhparam` 的并行实例,并且当第一个实例以 `0` 退出时,杀死其他实例?

如何运行 `$(nproc)`× `openssl dhparam` 的并行实例,并且当第一个实例以 `0` 退出时,杀死其他实例?

我正在运行openssl dhparam -out dhparam4096.pem 4096,它在任务持续时间内将单个核心固定在 100%(这在某些处理器上可能相当大)。我有 1 个或多个基本上处于空闲状态的附加核心,我想使用它们。

我想运行$(nproc)该命令的 × 个实例。不同的是,我不需要完成所有实例 - 只需要第一个退出的实例......一旦“获胜者”实例完成,0其余进程就应该是“d”或类似的,它不需要很优雅。SIGTERM

我正在学习parallelxargs实现这一目标,有许多指导文章可以完成全部并行任务,但我无法在搜索引擎上实现上述目标。我不喜欢使用parallelor的想法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

相关内容