我需要經常向多個主機發送大量檔案,而且速度至關重要,我希望它可以并行執行。
如何在 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,但我不知道在這種情況下如何使用它們
uj5u.com熱心網友回復:
只需一個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@"$0":/var/test/folder --delete || exit 1'
或許注意到我們是如何偷偷溜進宿主的$0。您可以等效地但稍微不那么模糊地填充$0一個虛擬字串并使用$1,但它在這里并沒有真正產生很大的不同。
該-P 17說的最多17個行程并行運行(當然,調整自己的喜好),并-n 1說只有一次運行命令列的一個實體。 xargs如果其中一個行程失敗,仍然不提供中斷整個批處理的方法,并且只報告摘要結果代碼(例如,xargs如果至少一個行程失敗,則退出代碼將不為零)。
uj5u.com熱心網友回復:
使用GNU Parallel它應該是這樣的:
printf '%s\n' "${listofhosts[@]}" | parallel --will-cite --halt now,fail=1 rsync -rv --delete --checksum -e $(printf '%q' 'ssh -i rsa_key -o StrictHostKeyChecking=no') folder/ user@{}:/var/test/folder
棘手的部分是您必須顯式轉義包含空格(以及 中的其他字符$IFS)的引數。
注意:您可以rsync使用以下-j選項限制在 // 中運行的次數parallel:
... | parallel -j 8 --will-cite --halt now,fail=1 rsync -rv ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/353597.html
標籤:linux 猛击 同步 参数 gnu-parallel
