用户工具

站点工具


rsync多线程简单shell版

rsync多线程同步简单shell版

以目录为单位

#!/bin/sh
PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/root/bin"

dir='/www' #需同步的路径
ip='1.2.3.4.5' #目标ip
port='22' #ssh端口
opt='-auz --delete' #rsync 选项
key='/path/to/key' #ssh秘钥
user='root' #ssh登录用户
num=20 #"线程"(进程)数
depth='12 11 10 9 8 7 6 5 4 3 2 1' #归递目录深度

# 创建目标目录结构
rsync $opt --include "*/" --exclude "*"\
 -e "ssh -p $port -i $key"\
 $dir/ $user@$ip:$dir/

# 从深到浅同步目录
for l in $depth ;do
 todo=`find $dir -maxdepth $l -mindepth $l -type d`
 # 启动rsync进程
 for i in $todo; do
  now_num=`ps axw | grep rsync | grep $ip | grep -v '\-\-server' | wc -l`
  if [ $now_num -lt $num ]; then
   rsync $opt -e "ssh -p $port -i $key"\
    $i/ $user@$ip:$i/ &
   sleep 1
  else
  # 进程达到限定数量延时启动新的rsync
   while true; do
    sleep 5
    now_num=`ps axw | grep rsync | grep $ip | grep -v '\-\-server' | wc -l`
    if [ $now_num -lt $num ]; then
     rsync $opt -e "ssh -p $port -i $key"\
      $i/ $user@$ip:$i/ &
     sleep 1
     break
    fi
    done
   fi
 done
done

# 最终单进程验证
while true; do
 sleep 5
 now_num=`ps axw | grep rsync | grep $ip | grep -v '\-\-server' | wc -l`
 if [ $now_num -lt 1 ]; then
  rsync $opt -e "ssh -p $port -i $key"\
   $dir/ $user@$ip:$dir/
  break
 fi
done

以文件为单位

#!/bin/sh
PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/root/bin"

dir='/www' #需同步的路径
ip='1.2.3.4.5' #目标ip
port='22' #ssh端口
opt='-auz --delete' #rsync 选项
key='/path/to/key' #ssh秘钥
user='root' #ssh登录用户
num=20 #"线程"(进程)数

# 创建目标目录结构
rsync $opt --include "*/" --exclude "*"\
 -e "ssh -p $port -i $key"\
 $dir/ $user@$ip:$dir/

# 开始同步文件
todo=`find $dir -maxdepth $l -mindepth $l -type d`
# 启动rsync进程
for i in $todo; do
 now_num=`ps axw | grep rsync | grep $ip | grep -v '\-\-server' | wc -l`
 if [ $now_num -lt $num ]; then
  rsync $opt -e "ssh -p $port -i $key"\
   $i $user@$ip:$i &
  sleep 1
 else
 # 进程达到限定数量延时启动新的rsync
  while true; do
   sleep 5
   now_num=`ps axw | grep rsync | grep $ip | grep -v '\-\-server' | wc -l`
   if [ $now_num -lt $num ]; then
    rsync $opt -e "ssh -p $port -i $key"\
     $i $user@$ip:$i &
    sleep 1
    break
   fi
  done
 fi
done

# 最终单进程验证
while true; do
 sleep 5
 now_num=`ps axw | grep rsync | grep $ip | grep -v '\-\-server'  wc -l`
 if [ $now_num -lt 1 ]; then
  rsync $opt -e "ssh -p $port -i $key"\
   $dir/ $user@$ip:$dir/
  break
 fi
done
   
exit 0

水平有限,欢迎指正。

/data/vhosts/wiki-data/pages/rsync多线程简单shell版.txt · 最后更改: 2016/12/02 02:28 由 harbinbeer