先简单说下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加速你的命令”
占位符真心好用。可以结合 `-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我收下了