我正在运行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