并行运行最多 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并行将等待其中一个作业完成,然后再启动另一个命令。

您可以--jobs 8将作业数量限制为 8。您可以将 sort 的输出通过管道传输到 中,parallel就像使用 一样xargssem是一个别名parallel --semaphore

答案3

我编写了一个易于使用的 Perl 脚本,可以控制同时运行的最大命令数:https://github.com/matmu/parallelize_cmds

您可能感兴趣。

相关内容