Cách liên tục gọi rsync cho đến khi các tệp được chuyển thành công


27

Tôi đang cố gắng đồng bộ hóa các tệp từ một máy chủ từ xa không đáng tin cậy, có nghĩa là kết nối có xu hướng bị lỗi "ngẫu nhiên" với

rsync: kết nối bị đóng đột ngột

Rsync được gọi bằng --partial, vì vậy tôi muốn có thể gọi rsync trong một vòng lặp cho đến khi các tệp được chuyển hoàn toàn. Dường như không có một lá cờ nào để nói với rsync để thử lại.

Điều gì sẽ là cách tốt nhất để kịch bản nó? Một bash cho vòng lặp?


1
Mặc dù các câu trả lời dưới đây rất hữu ích, nhưng có thể là một ý tưởng tốt hơn để tìm hiểu lý do tại sao nó thất bại và làm cho nó dừng lại. Tôi giả sử bạn điều khiển máy chủ, máy khách và mạng ở giữa, vì vậy bạn có thể chạy tcpdump ở nhiều nơi khác nhau để xem cách nó được đóng. Có lẽ một trong các thiết bị tường lửa hoặc VPN của bạn đang đóng kết nối?
MarkR

Máy chủ mà nó đang kết nối là một máy chủ được chia sẻ, vì vậy tôi không có quyền truy cập root vào nó. Tôi có thể xem xét lý do tại sao nó đóng cửa, nhưng bây giờ tôi rất vui khi được thử lại. Dù sao cũng cảm ơn vì đã ngẩng cao đầu
Bruno Lopes

Tôi đã bị sốc khi phát hiện ra rsync không thực sự có khả năng thử lại!
Michael

rsync --partial --append có khả năng thử lại, thủ công hoặc trong tập lệnh kiểm tra mã trả về. Bản sao của: superuser.com/questions/302842/
Mạnh

Câu trả lời:


29

Nếu bạn đang đồng bộ hóa mọi thứ trong một đồng bộ hóa, hãy gọi rsync trong một vòng lặp cho đến khi rsync cung cấp cho bạn mã trả về thành công.

Cái gì đó như:

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

Điều này sẽ lặp lại, gọi rsync, cho đến khi nó đưa ra mã trả về 0. Bạn có thể muốn thêm một giấc ngủ vào đó để tránh sử dụng máy chủ của mình.


28
bạn chỉ có thể viết trong khi! rsync -a ....; ngủ 5; xong
Justin

1
chỉ cần cẩn thận cách bạn sử dụng cái này, ví dụ, nếu cố chạy nó qua cron thì bạn có thể gặp vấn đề tương tranh.
Keiran Holloway

3
Điều này sẽ biến thành một vòng lặp vô hạn nếu có lỗi không quá cảnh (ví dụ: lỗi đọc quyền hoặc ghi tệp). Tôi khuyên bạn nên kiểm tra trạng thái thoát của rsync để biết các lỗi mạng cụ thể, đại loại như RC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](hoặc bất kỳ trạng thái thoát nào bạn thấy từ các giọt mạng).
Gordon Davisson

1
Vì tôi không chạy (hoàn toàn) không giám sát này, các vòng lặp vô hạn và đồng thời không phải là vấn đề lớn, cảm ơn bạn.
Bruno Lopes

2
Đó là một rsync xấu hổ không có tính năng này được tích hợp, bởi vì bất kỳ loại vòng lặp dựa trên shell nào cũng sẽ nhắc mật khẩu trong trường hợp xác thực tự động không khả dụng hoặc không phù hợp.
Michael


1

thanh lọc tất cả cùng với sshpass

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.