Làm cách nào để kiểm tra xem rsync có thực hiện bất kỳ thay đổi nào trong bash không?


12

Tôi có một tập lệnh sử dụng rsync để đồng bộ hóa dữ liệu trong một điều khiển từ xa -> cục bộ. Ngay sau khi lệnh rsync được chạy, hãy kiểm tra xem mã lỗi có bằng 0 hay không. Nếu số 0 của nó, các lệnh tiếp theo được thực hiện. Tuy nhiên, điều này không tính đến thực tế là rsync có thể đã chạy thành công nhưng thực tế không thực hiện bất kỳ thay đổi nào. Bởi vì điều này, điều kiện bằng không sẽ chạy bất kể, đó là một chút dư thừa.

rsync -aEivm --delete /path/to/remote/ /path/to/local/

if [ $? -eq 0 ]; then
    # Success do some more work!
else
    # Something went wrong!
    exit 1;
fi

Điều gì sẽ là cách tiếp cận tốt nhất để mở rộng điều này để kiểm tra xem thực sự có bất kỳ thay đổi nào dựa trên lệnh rsync đã chạy hay không. Tôi đã đọc rằng cờ -i có thể cung cấp đầu ra cho thiết bị xuất chuẩn, nhưng làm thế nào để đặt nó trong một khối có điều kiện?


Bạn đã -vvào đó, vì vậy nó đã cung cấp thông tin bạn cần để xuất bản ... ví dụ: danh sách các tệp thực sự được gửi. Nếu không có gì thay đổi, đó chỉ là ./.
goldilocks

Ah! Điều gì sẽ xảy ra nếu tôi lấy ra -v và sử dụng -i thay vào đó và sau đó sử dụng kiểm tra chuỗi không trống trên lệnh rsync?
James White

Hình như bạn đã tìm ra giải pháp cho mình? :-)
Bjorn Munch

2
bạn có thể sử dụng a=$("rsync command"). Điều này sẽ thực thi rsynclệnh và lưu trữ stdouttrong a. Sau đó, bạn có thể chạy thử nghiệm trêna
nitishch

1
Bạn cũng có thể thêm một | grep /hoặc một cái gì đó tương tự, sau đó kiểm tra trạng thái thoát của grep với $?, nó sẽ là 1 nếu không có đầu ra.
Bjorn Munch

Câu trả lời:


9

Dựa trên các nhận xét cho câu hỏi ban đầu của tôi, hãy tạo đầu ra rsync thành thiết bị xuất chuẩn với cờ -i và sử dụng điều kiện kiểm tra không chuỗi để xem có gì thực sự thay đổi trong kiểm tra mã lỗi không. Việc gói lệnh rsync trong một biến cho phép kiểm tra được thực hiện.

RSYNC_COMMAND=$(rsync -aEim --delete /path/to/remote/ /path/to/local/)

    if [ $? -eq 0 ]; then
        # Success do some more work!

        if [ -n "${RSYNC_COMMAND}" ]; then
            # Stuff to run, because rsync has changes
        else
            # No changes were made by rsync
        fi
    else
        # Something went wrong!
        exit 1
    fi

Nhược điểm tiềm năng, bạn phải mất đầu ra dài dòng, nhưng bạn luôn có thể đăng nhập nó vào một tập tin thay thế.


1

Tôi muốn một giải pháp nghiêm ngặt hơn. Tôi không muốn grep for Number of created files:(tin nhắn có thể bằng ngôn ngữ khác) hoặc xóa tất cả các dòng trừ hai -vđầu ra (ai biết bản tóm tắt nào rsyncsẽ được in trong phiên bản tiếp theo?).

Tôi thấy rằng bạn có thể đặt định dạng của rsyncnhật ký, nhưng không phải là định dạng của thiết bị xuất chuẩn (xem man rsyncd.conf).

Ví dụ: thêm "Tệp đã thay đổi!" đến từng dòng với một tệp thực sự thay đổi, và sau đó grepcho nó:

rsync -a \
    --log-file=/tmp/rsync.log \
    --log-file-format="File changed! %f %i" \
    source-dir target-dir

if fgrep "File changed!" /tmp/rsync.log > /dev/null; then
    echo "rsync did something!"
fi
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.