并行在多台主机上进行 rsync

Rsync on multiple hosts in parallel

我需要经常向多个主机发送大量文件,速度非常重要,我希望它并行执行。

如何在 bash 脚本中 运行 将并行 rsync 同步到多个主机?

现在脚本看起来像这样

   for i in ${listofhosts[*]}
   do
   rsync -rv --checksum  folder/ -e "ssh -i rsa_key -o 
   StrictHostKeyChecking=no" user@$i:/var/test/folder --delete  || 
   exit 1
   done

LE:我正在考虑使用 GNU Parallelxargs 但我不知道如何在此使用它们情况

只需一个 shell 脚本,

#!/bin/bash
procs=()
for i in "${listofhosts[@]}"; do  # notice syntax fixes
  rsync -rv --checksum  folder/ -e "ssh -i rsa_key -o 
   StrictHostKeyChecking=no" user@$i:/var/test/folder --delete &
  procs+=($!)
done
for proc in "${procs[@]}"; do
  wait "$proc"
done

明显的缺点是你不能在其中一个失败后立即取消其他。如果你真的有“很多”主机,这可能会使你的网络带宽饱和到你后悔询问如何做到这一点的程度。

使用 xargs,您可以限制实例的数量 运行:

# probably better if you have the hosts in a file instead of an array actually,
# and simply run xargs <filename -P 17 -n 1 ...
printf '%s\n' "${listofhosts[@]}" |
xargs -P 17 -n 1 sh -c 'rsync -rv --checksum  folder/ -e "ssh -i rsa_key -o 
   StrictHostKeyChecking=no" user@"[=11=]":/var/test/folder --delete || exit 1'

也许注意到我们是如何偷偷在[=15=]中偷运宿主的。您可以等效地 略微 不那么模糊地使用虚拟字符串填充 [=15=] 并使用 </code>,但这在这里并没有太大的区别。</p> <p><code>-P 17 表示 运行 最多并行 17 个进程(显然,根据您的喜好进行调整),而 -n 1 表示仅 运行 一个实例一次命令行。 xargs 仍然没有提供在其中一个进程失败时中断整个批处理的方法,并且只报告摘要结果代码(例如,如果至少, xargs 的退出代码将是非零的其中一个进程失败)。

如果您想跟踪哪些失败了,也许可以让脚本将其打印到一个单独的文件中。

rm -r failures.txt
printf '%s\n' "${listofhosts[@]}" |
xargs -P 17 -n 1 sh -c 'rsync -rv --checksum  folder/ -e "ssh -i rsa_key -o 
   StrictHostKeyChecking=no" user@"[=12=]":/var/test/folder --delete && exit 0
    echo "[=12=]" failed: $? >>failures.txt'

如果这是为了后续处理,可能会将结果以机器可读的形式写入文件 - 也许只是 echo $? [=22=] 这样你就可以用

循环它
while IFS='' read -r exitcode hostname; do
   : 
done <failures.txt

或者可能是 CSV 或 JSON 等标准格式

使用 GNU Parallel,您将执行如下操作:

doit() {
  i=""
  rsync -rv --checksum  folder/ -e "ssh -i rsa_key -o StrictHostKeyChecking=no" user@$i:/var/test/folder --delete || 
    exit 1
}
export -f doit
parallel doit ::: ${listofhosts[@]}

我可以建议花 20 分钟阅读第 1+2 章(可能还有第 5 章):https://doi.org/10.5281/zenodo.1146014

你的命令行会爱上它。