最大X個のコマンドを並列に実行

最大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つのタスクを制限するにはどうすればよいですか?

答え1

インストールするとGNUパラレル達成したいことを簡単に実行できるツール:

$ 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ファイル名を上書きします。{}

引用する

答え2

一度見てみたいかもしれません GNUパラレルそしてその--semaphoreオプション。ドキュメントから:

- シグナル

カウントセマフォとして使用されます。 --semaphoreは、GNUがバックグラウンドで並列にコマンドを実行するようにします。同時ジョブ数に達すると、GNU Parallelは他のコマンドを実行する前にジョブの1つが完了するのを待ちます。

--jobs 8ジョブ数を8つに制限できます。parallelを使用するのと同じように、sortの出力をにパイプすることができますxargssemエイリアスですparallel --semaphore

答え3

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

あなたは興味があるかもしれません。

関連情報