私はそれを実行しておりopenssl dhparam -out dhparam4096.pem 4096
、作業中にシングルコアを100%に固定します(一部のプロセッサではかなり大きくなる可能性があります)。基本的にアイドル状態の追加コアが1つ以上ありますが、これを使用したいと思います。
$(nproc)
このコマンドのインスタンスを実行したいと思います。違いは、すべてのインスタンスを完了する必要はないということです。最初のインスタンスを終了するだけです。 「勝者」インスタンスが完了すると、0
残りのプロセスは「d」または類似している必要があります。エレガント。SIGTERM
parallel
私はこれを学び、達成するプロセスにxargs
あり、それを行う方法について多くの方法記事があります。みんな並列作業ですが、検索エンジンでは上記の目標を達成することはできません。私はparallel
orを使うアイデアが好きではありません。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
毎回の鍵は、すべてのコマンドが独自のプロセスグループにあるように、対話型シェルのプロンプトで実行することです。
答え2
コアが10000個未満の場合:
seq 10000 | parallel -N0 --halt now,success=1 openssl dhparam -out dhparam4096.pem 4096