在开发过程中总会遇到这种情况,就是需要将一个文件从一个机器拷贝到其他的很多台机器中,最简单的方法是用U盘拷出来再一个一个机器的插进去拷贝,另一张方法则是利用飞鸽传书或者QQ等工具传输,但是都不是很方便,因为每次只能拷贝到一个机器。还有一种方法是讲此文件共享,但是这会带来很多权限的问题。


本文提高了一个可以同时将一个文件从一个机器拷贝到多台机器的方法,采用的方式是链式传输(参照的博客链接http://engineering.tumblr.com/post/7658008285/efficiently-copying-files-to-multiple-destinations),如下图所示。wKiom1MV38zT-yxhAADX8QRQd3k279.jpg

本文的传输方式需要利用网络工具netcat,netcat号称Linux下的瑞士×××,一般在Linux中已经安装了。首先介绍机器1的shell脚本为

tar cv some_files | pigz | nc hostname_of_first_box 1234

先将文件进行压缩,这里先用tar再用pigz使之变成tar.gz的形式,而gz的压缩没有使用gzip,而是使用pigz,因为pigz可以使用多核多线程的方式进行压缩,提高压缩速度(性能区别见博客http://imysql.cn/2012/12/03/using-pigz-instead-of-gzip.html)。压缩了以后利用netcat发送出去。

机器2和机器3的脚本为

mkfifo myfifo
nc hostname_of_next_box 1234 <myfifo &
nc -l 1234 | tee myfifo | pigz -d | tar xvf -

建立一个fifo,然后将接收到的文件送入fifo,然后fifo将文件再传到下一个机器中。同时将接收到的文件进行解压缩。

最后一个机器,机器4的脚本为

nc -l 1234 | pigz -d | tar xvf -

同样也是接受文件,然后进行解压缩。