Linux: Đồng bộ hóa liên tục các tệp, một chiều


61

Kịch bản: Một IDE được thiết lập trên hộp máy tính để bàn Linux, chỉnh sửa các tệp PHP cục bộ. Mỗi lần tôi lưu một tệp, tôi muốn thay đổi này xuất hiện trên máy chủ linux nơi Apache đang chạy. Máy chủ có ssh (và samba và nfs cho vấn đề đó).

Để tham khảo, khi tôi chỉnh sửa các tệp trên Windows, cuối cùng tôi đã tìm thấy WinSCP là công cụ chính xác mà tôi cần - WinSCP chỉ có tính năng này, với đồng bộ ban đầu và sau đó cập nhật liên tục, sử dụng dịch vụ xem hệ thống tệp: Ngày".

Trên Linux, người ta có thể lập luận rằng sshfs có thể được sử dụng để vượt qua nhu cầu đồng bộ hóa hoàn toàn. Trên cửa sổ, một chia sẻ samba sẽ làm như vậy. Tuy nhiên, tôi muốn IDE hoạt động với các tệp cục bộ (trên đĩa SSD!), Không phải truy cập mạng để thực hiện lập chỉ mục PHP và whatnots, mất nhiều thời gian.

Tuy nhiên, sshfs có thể là một phần của giải pháp - do đó, việc đồng bộ hóa liên tục chỉ cần được thực hiện giữa hai thư mục cục bộ.

Bất kỳ ý tưởng hoặc con trỏ?


xem xét sử dụng công cụ rsync hoặc chia sẻ thư mục trong tài liệu gốc của máy chủ web để bạn có thể thao tác trên các tệp ngay dưới cửa sổ
Vinicius Kamakura

2
rsync là "một đi". Tôi cần cập nhật liên tục, đó là toàn bộ vấn đề ở đây - Tôi chỉnh sửa tệp, lưu tệp và sản phẩm / hệ thống / ý tưởng tôi yêu cầu sẽ chọn hành động lưu này và tải lên phiên bản mới ngay lập tức. NB: Cả hai bên là Linux. NB2: Tôi muốn chỉnh sửa trên các tệp cục bộ, nếu không sshfs sẽ cắt nó.
stolsvik

6
Các cử tri ngoài chủ đề, đây là một trường hợp ranh giới, nhưng tôi nghĩ nó khá rõ ràng trong "các công cụ thường được các lập trình viên sử dụng" trong FAQ.
Karl Bielefeldt

Trong khi nó không phải là một trận đấu hoàn hảo, bạn có thể nhìn vào overlayfs
PHS

Câu trả lời:


57

Bạn cũng có thể sử dụng inotifywaittừ gói công cụ inotify.

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done

13
Trên trang web công cụ inotify , có một ví dụ khá hay về việc sử dụng inotify-Wait để kích hoạt rsync.
Karl Bielefeldt

Tôi đã tìm kiếm điều chính xác này đêm qua! ahhh Tôi yêu siêu người dùng
CenterOrbit

Có cách nào để làm điều này nhưng giữ cho ổ cắm mở? rsync/ scpcó độ trễ khó chịu trong khi thiết lập kết nối ssh.
Flash

1
@Flash có, bạn có thể sử dụng ghép kênh SSH để giữ cho ổ cắm mở.
Will Angley

31

Lsyncd sẽ là một giải pháp tốt cho việc này.

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 các hệ thống tập tin hoặc blockdevice mới và không cản trở hiệu suất của hệ thống tập tin cục bộ.

Tóm lại, nó sử dụng cùng loại công cụ để thực hiện công việc (inotify và rsync) như được đề xuất bởi các câu trả lời khác, nhưng sẽ dễ dàng hơn để thiết lập cho một người không quen thuộc với kịch bản shell.


Không chỉ dễ dàng hơn, nó còn cố gắng xử lý các tình huống như di chuyển thư mục đúng cách, mà không cần rsyncing.
Ciantic

5
Cẩn thận: Chương trình này có một số tính năng có vấn đề. Khi viết bài này: 1. Nó xóa các tệp từ xa không có trong nguồn theo mặc định. 2. "remote:" dùng để chỉ "remote: /" thay vì thư mục home. 3. Nó daemonizes, vì vậy bạn không biết những gì đang xảy ra. 4. Nó không ngay lập tức tôn trọng tín hiệu HẠN.
Friedrich

27

Tôi cần điều này rất nhiều vì mã của tôi cần chạy trên các hộp từ xa và tôi viết mã trên máy cục bộ. Tôi tìm thấy một công cụ tuyệt vời mà bạn có thể sử dụng để liên tục theo dõi các thư mục cục bộ của mình và đồng bộ hóa chúng với thư mục từ xa hoặc cục bộ: https://github.com/axkibe/lsyncd

Một lệnh đơn giản để liên tục đồng bộ hóa một thư mục cục bộ với máy từ xa qua ssh sẽ là:

lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>

Giống như với bất kỳ lệnh rsync nào khác, hãy đảm bảo bạn cung cấp đúng đường dẫn thư mục và kiểm tra trước khi chạy lệnh. Tôi gần như đã giết một trong những máy từ xa của mình vì tôi đã lỡ đưa ra một thư mục đích chính xác. Hãy chắc chắn rằng bạn không bỏ lỡ đường dẫn từ xa và không sử dụng '/' trừ khi bạn biết bạn đang làm gì.


Điều này xứng đáng nhận được nhiều sự ủng hộ hơn, thậm chí ba năm sau khi nó được đăng
FliiFe

Hoạt động tuyệt vời, cuối cùng nó đã hoạt động trên Mac OS Sierra của tôi, hoạt động tuyệt vời.
Erik van de Ven

2

Nếu bạn cần quan sát hệ thống tập tin, thì inotify là cách để làm điều đó. Tôi sẽ viết một kịch bản python đơn giản bằng pyinotify để thực hiện đồng bộ hóa khi hệ thống tập tin được thay đổi. Xem tài liệu . Bạn cũng có thể kiểm tra autosync.py để tìm cảm hứng. Chúc vui vẻ.


1

Những gì tôi đã làm một lần là có một tập lệnh bash chạy ls -ltrong một vòng lặp (với một số giấc ngủ) và so sánh với đầu ra trước đó. Nếu nó thay đổi, hãy thực hiện đồng bộ hóa của bạn.

#!/bin/bash

listcommand="ls -l $*"

newfilelist=$( $listcommand )
while true
do
   if [[ $oldfilelist != $newfilelist ]]
   then
      oldfilelist=$newfilelist
      # run your synchronization tool
   fi
   sleep 10 || exit 2 
   newfilelist=$( $listcommand )
done

Bắt đầu tập lệnh này trong một thiết bị đầu cuối mới với tên tệp là đối số (sau khi đưa vào công cụ đồng bộ hóa của bạn).

(Tôi đã sử dụng điều này để bắt đầu một quá trình biên dịch, không phải để đồng bộ hóa, nhưng điều này sẽ hoạt động theo cách tương tự.)


-1

Cách tiếp cận đơn giản hơn nhiều:

Xuất / var / www của bạn bằng samba (hoặc nfs) và làm việc trên các tệp trực tiếp trên máy chủ.

Một giải pháp khác: hầu hết các IDE đều cho phép cấu hình triển khai khác nhau - kiểm tra xem có cấu hình nào phù hợp với bạn không.

Hoặc đặt hệ thống Quản lý mã nguồn như Git, Bazaar, v.v.

Chúc may mắn !!


3
Cảm ơn đã trả lời. Tuy nhiên, tôi đặc biệt loại trừ chính cách tiếp cận này trong câu hỏi.
stolsvik
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.