Linux

如何重複呼叫 rsync 直到文件傳輸成功

  • July 22, 2021

我正在嘗試從不可靠的遠端伺服器同步文件,這意味著連接往往會“隨機”失敗

rsync:連接意外關閉

rsync 是用 –partial 呼叫的,所以我希望能夠在循環中呼叫 rsync,直到文件完全傳輸。似乎沒有一個標誌告訴 rsync 重試。

編寫腳本的最佳方法是什麼?bash for 循環?

如果您在一次同步中同步所有內容,請在循環中呼叫 rsync,直到 rsync 為您提供成功的返回碼。

就像是:

RC=1 
while [[ $RC -ne 0 ]]
do
  rsync -a .....   
  RC=$?
done

這將循環呼叫 rsync,直到返回程式碼為 0。您可能希望在其中添加一個 sleep 以防止對您的伺服器進行 DOS 操作。

不久前我遇到了同樣的問題。最後,我寫了一些類似於大衛的答案的東西,但是用最大重試次數、響應 Ctrl-C 等來修飾它:http: //blog.iangreenleaf.com/2009/03/rsync-and-retrying-直到我們得到它.html

顯而易見的解決方案是檢查返回值,如果 rsync 沒有返回成功,則再次執行它。這是我的第一次嘗試:

while [ $? -ne 0 ]; do rsync -avz --progress --partial /rsync/source/folder backupuser@backup.destination.com:/rsync/destination/folder; done

這樣做的問題是,如果你想停止程序,Ctrl-C 只會停止目前的 rsync 程序,而循環會立即啟動另一個程序。更糟糕的是,我的連接不斷中斷,以至於 rsync 在連接問題上會以與 SIGINT 上相同的“未知”錯誤程式碼退出,所以我無法讓我的循環在需要時區分和中斷。這是我的最終腳本:

#!/bin/bash

### ABOUT
### Runs rsync, retrying on errors up to a maximum number of tries.
### Simply edit the rsync line in the script to whatever parameters you need.

# Trap interrupts and exit instead of continuing the loop
trap "echo Exited!; exit;" SIGINT SIGTERM

MAX_RETRIES=50
i=0

# Set the initial return value to failure
false

while [ $? -ne 0 -a $i -lt $MAX_RETRIES ]
do
i=$(($i+1))
rsync -avz --progress --partial /rsync/source/folder backupuser@backup.destination.com:/rsync/destination/folder
done

if [ $i -eq $MAX_RETRIES ]
then
 echo "Hit maximum number of retries, giving up."
fi

引用自:https://serverfault.com/questions/98745