`$(nproc)`× `openssl dhparam`の並列インスタンスを実行する方法と、最初のインスタンスが `0`で終了した場合、別のインスタンスを終了しますか?

`$(nproc)`× `openssl dhparam`の並列インスタンスを実行する方法と、最初のインスタンスが `0`で終了した場合、別のインスタンスを終了しますか?

私はそれを実行しておりopenssl dhparam -out dhparam4096.pem 4096、作業中にシングルコアを100%に固定します(一部のプロセッサではかなり大きくなる可能性があります)。基本的にアイドル状態の追加コアが1つ以上ありますが、これを使用したいと思います。

$(nproc)このコマンドのインスタンスを実行したいと思います。違いは、すべてのインスタンスを完了する必要はないということです。最初のインスタンスを終了するだけです。 「勝者」インスタンスが完了すると、0残りのプロセスは「d」または類似している必要があります。エレガント。SIGTERM

parallel私はこれを学び、達成するプロセスにxargsあり、それを行う方法について多くの方法記事があります。みんな並列作業ですが、検索エンジンでは上記の目標を達成することはできません。私はparallelorを使うアイデアが好きではありません。xargs並列代替私が読む方法を見つけたら、それを私の読書リストに追加します。

終了する最初のインスタンスが別の$(nproc)インスタンスを終了するコマンドのインスタンスを実行する方法は?0

追加情報:Debian 11、aarch64 bash、。

ベストアンサー1

対話型シェルプロンプトで、次の操作を行いますzsh

(repeat $(nproc) { {your-command && kill 0} & }; wait)

サブシェルは新しいプロセスグループで実行され、your-command正常に終了した最初のインスタンスはkill 0プロセスグループの終了をトリガーします。

parallel次の操作を実行できますmoreutils

parallel sh -c 'your-command && kill 0' -- {1..$(nproc)}

{1..5}zshのは他の多くのシェルでも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

毎回の鍵は、すべてのコマンドが独自のプロセスグループにあるように、対話型シェルのプロンプトで実行することです。

おすすめ記事