Tiếp tục rsync qua SSH sau khi kết nối bị hỏng?


45

Tôi phải chuyển một lượng lớn dữ liệu (> 80 GB) qua ssh bằng rsync. Mọi thứ đều hoạt động tốt, nhưng kết nối DSL nơi dữ liệu sao lưu được gửi từ đó sẽ giảm xuống một lần trong 24 giờ (tối đa 3 nhà cung cấp dịch vụ chuyển đổi không phải là một tùy chọn).

Làm thế nào để tôi:

  1. Tự động khởi động lại quá trình chuyển khi kết nối được sao lưu?

  2. Hãy chắc chắn rằng không có tình cờ hai lệnh rsync chạy cùng một lúc?


Bạn không thể kiểm tra mã trả lại? while ./run_script; do echo "Retrying..."; done; echo "Done."Đảm bảo run_scriptlợi nhuận 0thành công.
Kerrek SB

Bản sao có thể có của serverfault.com/q/98745 .
tanius

Một số thông tin hữu ích ở đây - Tôi chỉ muốn thêm một cách để làm tròn vấn đề yêu cầu mật khẩu lặp đi lặp lại là sử dụng lệnh 'sshpass'. Thông thường, cái này cần được cài đặt với apt-get, v.v.
Rachael Saunders

Câu trả lời:


52

Những điều sau đây sẽ hữu ích:

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial source dest
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 180
    fi
done

Khi kết nối chết, rsync sẽ thoát với mã thoát khác không. Kịch bản lệnh này chỉ đơn giản là chạy lại rsync, để nó tiếp tục cho đến khi quá trình đồng bộ hóa hoàn thành bình thường.


1
Cảm ơn, tôi đang thử cái này ngay bây giờ ... nhưng nên thế này: nếu ["$?" = "0"] không phải là: if ["$?" == "0"] (toán tử so sánh)?

1
Không, trong bash "=" là sự bình đẳng chuỗi (một trong nhiều điều khiến nó khó hiểu, tôi nghĩ vậy!)
Peter

6
== là bí danh cho =: D
bbaja42

8
Ah, tốt để biết. Bash sẽ không bao giờ hết ngạc nhiên / làm tôi kinh hoàng :-P
Peter

2
Tuy nhiên, đến bữa tiệc muộn, đối với hậu thế: A) chỉ cần sử dụng: if rsync -avz - Destial source Dest; thì ... B) nếu bạn muốn so sánh các giá trị tích phân nếu sử dụng dấu ngoặc kép để mở rộng số học: if (($? = 0)) thì;
dùng18402

7

Điều này không giống với câu trả lời của Peter, nhưng cung cấp cho người dùng tùy chọn tệp từ xa nào anh ta muốn và nơi anh ta muốn lưu nó (cũng như thực hiện rsync qua ssh). Thay thế USER và HOST bằng tên người dùng và máy chủ của bạn tương ứng.

#! / bin / bash
echo -e "Vui lòng nhập đường dẫn tệp đầy đủ (đã thoát):"
đường dẫn đọc -r
tiếng vang "Đường dẫn: $ đường dẫn"
echo -e "Nhập đích:"
đọc -r dst
tiếng vang "Điểm đến: $ dst"
trong khi [1]
làm
    rsync --proceed --partial --append -vz -e ssh "USER @ HOST: $ path" $ dst
    nếu ["$?" = "0"]; sau đó
        tiếng vang "rsync hoàn thành bình thường"
        lối ra
    khác
        echo "rsync fail. Đang thử lại sau một phút ..."
        ngủ 60
    fi
làm xong

Các tùy chọn rsync được sử dụng ở đây cho phép thống kê tiến trình trong quá trình chuyển, lưu tệp một phần khi gặp sự cố không mong muốn và khả năng nối thêm các tệp đã hoàn thành một phần khi tiếp tục. Tùy chọn -v làm tăng tính dài dòng, tùy chọn -z cho phép nén (tốt cho kết nối chậm, nhưng yêu cầu nhiều năng lượng cpu hơn ở cả hai đầu) và tùy chọn -e cho phép chúng tôi thực hiện chuyển khoản này qua ssh (mã hóa luôn tốt).

Lưu ý: Chỉ sử dụng điều này nếu bạn đã bật đăng nhập khóa chung với ssh của mình, nếu không, nó sẽ yêu cầu bạn nhập mật khẩu khi khởi động lại (giết tất cả chức năng của tập lệnh).


1
Đây là câu trả lời tốt nhất của câu hỏi ban đầu. Nó cũng áp dụng cho một bản sao với câu trả lời sai tại: serverfault.com/questions/98745/ trên
rickfoosusa

5

Trình giám sát trình nền (trình quản lý kiểm soát quy trình) có thể hoạt động rất tốt sau khi tạo chứng chỉ rsa của cả hai bên, với cấu hình tương tự như sau: (/ etc / giám sát viên / giám sát viên là đường dẫn tệp cấu hình trên các hệ thống dựa trên debian)

[program:rsync-remoteserver]
command=rsync -avz --progress root@server.com:/destination /backup-path
stdout_logfile=/out-log-path  
stderr_logfile=/errlogpath

1

Câu trả lời của @ Peter có vẻ rất hữu ích, nhưng đối với tôi, điều quan trọng là sử dụng --updatetùy chọn. Sau khi kết nối được nối lại, không có --updatersync đã cố gắng đồng bộ hóa tất cả từ đầu. Với --update, các tập tin đã tồn tại được bỏ qua.

rsync --partial --update --progress -r [SOURCE] [DESTINATION]


2
--updatebỏ qua các tệp đã tồn tại ... Bao gồm cả những tệp chưa được sao chép hoàn toàn vào mục tiêu. Tôi nghĩ rằng nó đi ngược lại với hầu hết các trường hợp sử dụng.
durum

@durum điều đó không đúng ít nhất là trên rsync 3.1.2. Sau khi chuyển bị gián đoạn tôi thấy nó hoạt động đúng trên cùng một tệp. Tôi đã sử dụng rsync trên ssh, lệnh là rsync --partial --update file1 remotehost:file1. sau khi chuyển 15% tôi đã phá vỡ chuyển khoản (giết -KILL).
filiprem
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.