web-dev-qa-db-ja.com

最大X個のコマンドを並行して実行

私はこのようなものを実行しています:

find . -maxdepth 1 -type f -note -iname "*.gpg" | sort | while read file ; do
    echo "Encrypting $file..."
    gpg --trust-model always --recipient "[email protected]" --output "$file.gpg" \
        --encrypt "$file" && rm "$file" 
done

これはうまく機能しますが、GPGは暗号化操作に複数のコアを使用するように最適化されていないようです。私が暗号化しているファイルのサイズは約2GBで、かなりの数があります。 Xジョブを並行して実行してファイルを暗号化してから削除できるようにしたいと思います。たとえば、一度に8ジョブに制限を設定して、これを行うにはどうすればよいですか?

4
Naftuli Kay

GNU Parallel ツールをインストールすると、達成しようとしていることを非常に簡単に行うことができます。

$ find . -maxdepth 1 -type f -note -iname "*.gpg" | sort | \
      parallel --gnu -j 8 --workdir $PWD '                 \
         echo "Encrypting {}...";                          \
         gpg --trust-model always                          \
           --recipient "[email protected]" --output "{}.gpg"   \
           --encrypt "{}" && rm "{}"                       \
      '

詳細

上記は、findの出力を取得してparallelまで実行し、一度に8つ実行しています。どこでも{}が発生すると、findから渡されるファイル名がそれらの場所の{}に置き換わります。

参考文献

5
slm

gnu parallel とその--semaphoreオプションを確認することをお勧めします。ドキュメントから:

- セマフォ

カウントセマフォとして機能します。 -セマフォにより、GNU parallelはバックグラウンドでコマンドを開始します。同時ジョブの数に達すると、GNU parallelは、これらのいずれかが別のコマンドを開始する前に完了してください。

--jobs 8を使用して、ジョブの数を8に制限します。parallelの場合と同じように、sortの出力をxargsにパイプできます。 semparallel --semaphoreのエイリアスです

4
Anthon

同時に実行されるコマンドの最大数を制御できる使いやすいPerlスクリプトを作成しました: https://github.com/matmu/parallelize_cmds

あなたにとって興味深いかもしれません。

0
Matthias Munz