使用xargs -P加速你的命令


先简单说下xargs的用法,xargs可以按行执行多条命令。比如某个文件中包含了需要删除的文件列表,原先你可能需要写shell脚本来逐行执行,但是有了xargs之后一行就可以了。

cat files-to-delete | xargs rm -f

第二个要学习的是xargs的占位符功能,例子如下:

cat files-to-move | xargs -I {} mv {} foo/

这里使用-I指定占位符,在命令中使用这个占位符代表管道左边的内容即可。

第三个要学习也是本次的重点,是并行执行。事实上,并行也是最简单的提高命令执行速度的方法。举个例子,你要到多台服务器上执行一个命令,常规的方法是串行执行,但是假如我们想并行呢?

cat servers | xargs -P 4 -I {} ssh {} "hostname && date"

上面演示了使用xargs并行执行的方法,-P 4指定使用4个进程并行执行。使用并行后,原先假设20个服务器,每台平均花费5s的话,串行执行使用100s,但是并行后只要25s,是原来的四分之一,大大提高了速度。

并行执行的进程数建议使用CPU核的个数,一般可以通过如下命令查看:

fgrep -c 'model name' /proc/cpuinfo

最后建议实际尝试下,个人已经通过并行的方法把原来一个要运行20min的脚本提速到了2m,效果是不是非常明显。


2 responses to “使用xargs -P加速你的命令”

  1. 占位符真心好用。可以结合 `-n 1` 这样来限制参数的数量,可以用`–verbose` 结合echo来先确定最终执行的命令。

    GNU的findutils里的版本占位符只需要 `-i` 即可

    freeBSD的只能`-I {}`使用了

    • 因为xargs的文档中说
      -i[replace-str]
      This option is a synonym for -Ireplace-str if replace-str is specified, and for -I{} otherwise. This option is deprecated; use -I instead.
      所以我就没用过小写的

      不过verbose我收下了