并行在多台主机上进行 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 Parallel 或 xargs 但我不知道如何在此使用它们情况
只需一个 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
你的命令行会爱上它。
我需要经常向多个主机发送大量文件,速度非常重要,我希望它并行执行。
如何在 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 Parallel 或 xargs 但我不知道如何在此使用它们情况
只需一个 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
你的命令行会爱上它。