Linux
如何重複呼叫 rsync 直到文件傳輸成功
我正在嘗試從不可靠的遠端伺服器同步文件,這意味著連接往往會“隨機”失敗
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