Làm cách nào để kích hoạt rsync khi sửa đổi tệp?


18

Tôi có thể đồng bộ hóa các thư mục với rsync -avz /directory /target, bây giờ tôi muốn làm điều đó nếu tôi thay đổi một tệp trong /directoryđó rsyncnên được gọi tự động.

Tôi đang sử dụng Virtual Box và thư mục dùng chung của Virtual Box rất chậm, đặc biệt nếu bạn có một trang web đang sử dụng thư mục dùng chung làm tài liệu gốc. Với rsynctôi sẽ có thể làm việc với các tệp cục bộ của tôi trên thư mục dùng chung và tự động đồng bộ hóa với tài liệu gốc.

Tôi hy vọng ai đó có ý tưởng làm thế nào, crontabsẽ không tốt, vì nó được thực hiện mỗi x phút, vì vậy nếu tôi không làm gì, nó vẫn sẽ gọi rsyncnhưng không sửa nếu tôi sửa đổi tệp của mình.

Trân trọng

Câu trả lời:


18

crontab sẽ không tốt, vì nó được thực thi mỗi x giây / phút, vì vậy nếu tôi không làm gì, nó vẫn sẽ gọi rsync nhưng không phải nếu tôi sửa đổi tệp của mình

rsyncsẽ chỉ đồng bộ hóa các tập tin đã được thay đổi. Nếu không có gì thay đổi, nó sẽ thoát. Đó thực sự là một chi phí tối thiểu.

Nếu bạn không hài lòng với điều đó, bạn có thể sử dụng inotifywait:

while inotifywait -r /directory/*; do
    rsync -avz /directory /target
done

Điều đó sẽ ngay lập tức hơn nhưng nó sẽ làm mọi thứ mỗi khi bạn tiết kiệm.


1
Có vẻ như vấn đề là inotify không thể kiểm tra các thư mục nfs được chia sẻ. để chắc chắn, những gì tôi muốn, hãy thử mô tả tôi có cài đặt hộp ảo với vagrant, ở đó tôi có một "dự án" thư mục được chia sẻ khi khởi động, tất cả các tệp máy chủ web của tôi đều nằm ở đó để tôi có thể sửa đổi chúng trên máy chủ của mình Hệ thống (win7) như tôi đã nói với các thư mục chia sẻ hộp ảo rất chậm, vì vậy giải pháp có thể là đồng bộ thư mục nfs được gắn kết sang một nơi khác, ví dụ / var / www nhưng các cách phổ biến không hoạt động, tôi đã thử các tệp được trao đổi, icrontab, gues gamin hoặc fam sẽ giúp, nhưng tôi không biết làm thế nào để bắt đầu hoặc sử dụng chúng
BlackScorp

@BlackScorp thực tế bạn bị mắc kẹt chỉ với rsync và để nó quyết định những gì cần đồng bộ hóa. Khi tôi dẫn đầu trong câu trả lời, đó không phải là một lựa chọn tồi tệ.
Oli

1
Tùy chọn khác là đẩy các tệp từ máy chủ lưu trữ thay vì cố gắng phát hiện các thay đổi từ xa.
Oli

Vâng, giải pháp này tôi đã sử dụng trước đây, nó có 2 vấn đề: 1) Tôi phải chỉnh lại mọi lúc vào hộp ảo của mình để chỉnh sửa tệp, có nghĩa là, ảo của tôi phải chạy, chỉnh sửa nhanh không hoạt động nữa 2) Tôi không biết tại sao, nhưng vì trong quá trình quét dự án samba IDE (Netbeans) của tôi cho thấy 99% sử dụng CPU và mọi thứ trong hộp ảo chỉ chậm trong khi phát triển, tôi sẽ thử giải pháp rsyn + cronjob hoặc xây dựng php trong máy chủ web
BlackScorp

Các inotifywaitgiải pháp có một nhược điểm nhỏ nhưng quan trọng: nó không phát hiện những thay đổi đó đã xảy ra khi rsyncđang chạy. Xem xét tình huống sau: tệp A bị thay đổi; rsync được kích hoạt; khi rsync gần như hoàn tất đồng bộ hóa tệp A, tệp B bị thay đổi. Bây giờ, rsyncđã hoàn tất và inotifywaitđang chạy, nhưng tệp B không được đồng bộ hóa và sẽ không được đồng bộ hóa cho đến khi có một số thay đổi tiếp theo. Cân nhắc sử dụnglsyncd theo đề xuất của @Arigion.
MarSoft

6

Bạn có thể sử dụng Lsyncd (Daemon đồng bộ hóa trực tiếp) :

Lsyncd xem một giao diện giám sát sự kiện cây thư mục cục bộ (inotify hoặc fsevents). Nó tổng hợp và kết hợp các sự kiện trong vài giây và sau đó sinh ra một (hoặc nhiều) quá trình để đồng bộ hóa các thay đổi. Theo mặc định, đây là rsync. Do đó, Lsyncd là một giải pháp nhân bản trực tiếp có trọng lượng nhẹ, tương đối dễ cài đặt, không yêu cầu hệ thống tập tin mới hoặc thiết bị chặn và không cản trở hiệu suất của hệ thống tập tin cục bộ.

Dưới đây là ví dụ hướng dẫn cho Ubuntu 16.04 .


2

Bạn có thể sử dụng inotifywaitrsync. inotifywaitvới sự kiện modify,create,deleteđược kích hoạt. Bằng cách này, bạn sẽ chỉ đồng bộ hóa với máy chủ của mình khi tệp thay đổi, nếu không, nó sẽ đồng bộ hóa bất cứ khi nào tệp được đọc (người chỉnh sửa đọc nhiều lần tệp của bạn để kiểm tra xem có bất kỳ thay đổi nào không). Như vậy đã nói:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done

Điều này sẽ không phát hiện ra những thay đổi xảy ra trong khi rsync đang chạy. Cân nhắc sử dụng lsyncdtheo đề xuất của @Arigion.
MarSoft

điều này sẽ áp dụng lại tất cả các sự kiện trên tất cả các tệp sau mỗi thay đổi ... và khi áp dụng, nó sẽ không thấy bất kỳ thay đổi nào trong khoảng thời gian đó ...
Ai đó

0

Mở rộng một chút về nhận xét cho câu trả lời được chấp nhận Tôi đã thành công khi sử dụng fswatch để kích hoạt một scptệp đã thay đổi cho khách. Trên Linux, đây là một trình bao bọc xung quanh inotifynhưng nó cũng là nền tảng chéo (Tôi đang dùng Mac với một khách QEMU dựa trên Arm). Tôi cũng đã giải quyết một bản sshdựng từ xa. Phương pháp đẩy hoạt động tốt với các cổ phiếu hành xử theo cách ít hơn lý tưởng.

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.