Là cp / rsync không đồng bộ?


2

Chúng tôi đang chạy một tập lệnh sao lưu, trước tiên sao chép tệp vào đích và sau đó chạy tar trên nó

DIR2BCK='/foo/bar'
TMPDIR=$(mktemp -d)
rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1
tar czf /tmp/foo.backup.tar ${TMPDIR}

Sau khi chạy lệnh cuối cùng này, đôi khi cảnh báo sau được hiển thị:

/tmp/tmp.blqspkA136: tệp đã thay đổi khi chúng tôi đọc nó

Chúng tôi sao chép đích đến một thư mục tạm thời chính xác để tránh thay đổi tệp tại thời điểm nén. Hành vi này cũng có thể tái tạo khi sử dụng cp lệnh thay vì rsync. Cả đời tôi nghĩ những lệnh này là đồng bộ, nhưng cảnh báo này dường như cho thấy điều ngược lại.

Nếu tôi đặt một sleep lệnh giữa rsync / cptar dòng, cảnh báo không hiển thị, nhưng tôi coi đây là một giải pháp không hoàn toàn sạch sẽ.

Một số sự thật:

  • Tôi đã thử thêm một sync lệnh giữa rsynctar các lệnh có cùng kết quả.
  • Theo đề xuất của @jcbermu, tôi cũng đã thử thay đổi tập lệnh để hai dòng là:

    rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 &
    wait
    

    Tôi chạy tập lệnh nhiều lần và một số trong số họ thể hiện hành vi tương tự, tuyên bố tập tin đã thay đổi khi sao chép.

  • Hệ thống tập tin được sử dụng là EXT4 cho cả ${TMPDIR}${DIR2BCK}.

  • ${DIR2BCK} là trên một hệ thống tập tin từ xa, thực sự đây là một điểm gắn kết samba của một máy từ xa. ${TMPDIR} là trên hệ thống tập tin cục bộ. Tuy nhiên, thay đổi ${DIR2BCK} đến hệ thống tập tin cục bộ làm cho không có sự khác biệt.
  • Tất cả các hệ thống tập tin đều dựa trên phần cứng RAID-5.

Những lệnh này có thực sự đồng bộ không? Nếu không, có cách nào để làm cho chúng như vậy, hoặc một lệnh thay thế?


Vâng, các lệnh này được thực hiện khi chúng thoát. Bạn không trích dẫn tên tập tin / thư mục. Vui lòng sửa nó càng sớm càng tốt.
Daniel B

@DanielB Sai lầm của tôi. Mặc dù logic là như nhau, nhưng đây không phải là mã thực tế. Một thực tế bao gồm các trích dẫn.
nKn

Vậy thì có lẽ có một lỗi tinh tế trong thực mã. Hoặc là mã ở trên thực sự đủ để tái tạo vấn đề?
Daniel B

Vâng, nó là đủ, vì các đường dẫn là chính xác. Vấn đề chính là khi nào tar bắt đầu rsync / cp dường như chưa kết thúc sao chép và cảnh báo được hiển thị. Tôi giả sử các lệnh này là đồng bộ, đó là lý do tại sao tôi ngạc nhiên.
nKn

Don Patrick giả định, thử. Nếu không, một câu trả lời đủ điều kiện không thể được cung cấp. // sync không giúp được gì ở đây Bạn không truy cập dữ liệu thô trên thiết bị. // Vui lòng cung cấp thông tin về hệ thống tập tin nào cả $TMPDIR$DIR2BCK cư trú trên.
Daniel B

Câu trả lời:


0

Một giải pháp là viết lại thành:

rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 ; tar czf foo.backup.tar ${TMPDIR}

Vì thế, tar sẽ không bắt đầu cho đến khi rsync kết thúc


Giải pháp khác là gửi cp / rsync vào nền và đợi cho đến khi nó kết thúc bằng lệnh wait.

Ví dụ:

rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 &
wait
tar czf foo.backup.tar ${TMPDIR}

Cuối cùng & bên trong rsync dòng gửi thực thi đến nền (nó trở thành một đứa trẻ của phiên hiện tại), và sau đó wait buộc phiên vỏ này phải đợi cho đến khi tất cả trẻ em đã hoàn thành để tiếp tục.


1
Vấn đề với cách tiếp cận đầu tiên là nó tương đương với cách tôi đang sử dụng. Chia hai lệnh thành hai dòng giống như một lớp lót với ; làm dải phân cách. Không ai trong số họ nên làm tar dòng bắt đầu cho đến khi rsync / cp các lệnh đã kết thúc nếu chúng đồng bộ, nhưng điều đó không xảy ra trong trường hợp này. Tôi sẽ thử cách tiếp cận thứ hai và lấy lại.
nKn

Thật không may, sự thay đổi mà bạn đề xuất cho thấy hành vi tương tự trong một số lần chạy, tôi đã chỉnh sửa câu hỏi của mình khi thêm bài kiểm tra này.
nKn

0

Tôi đặt một lệnh ngủ giữa rsync / cp và các dòng tar, cảnh báo không hiển thị, nhưng tôi coi đây là một giải pháp không hoàn toàn sạch sẽ.

Tốt cho bạn hoặc có tiêu chuẩn. Điều gì xảy ra nếu, thay vì ngủ, bạn sử dụng:

đồng bộ sudo; tiếng vang 3 | sudo tee / Proc / sys / vm / drop_caches

Bạn có nghĩ rằng đó là một giải pháp tốt?

Lưu ý: / Proc / sys / vm / drop_caches dường như là những gì Ubuntu sử dụng và dự kiến ​​sẽ không phải là cách tiếp cận hoạt động trên tất cả các Unix (mặc dù có thể là tất cả các Linux). Tôi đang đề cập đến nó sau khi đọc https://ubuntuforums.org/showthread.php?t=589975 và, sau khi đọc một báo cáo ban đầu đặt câu hỏi về sự an toàn của việc này, hãy đọc thêm các bài viết chủ đề diễn đàn xác nhận sự an toàn của nó.


Tôi quên đề cập đến trong câu hỏi của mình, nhưng tôi đã thử sync lệnh không thành công. Tôi đã thử cả hệ thống tập tin cục bộ và hệ thống từ xa như một định mệnh của bản sao, nhưng điều tương tự cũng xảy ra. Các drop_caches không tốt cho chúng tôi vì chúng tôi sử dụng rất nhiều HĐH khác nhau (CentOS, Ubuntu, Debian ...).
nKn
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.