Sự kiện thay đổi thư mục và tập tin chia sẻ


14

Tôi có máy ảo Ubuntu mà tôi đang truy cập thông qua Vagrant. Trên máy chủ của tôi (Mac OSX), có một thư mục chứa vài tệp mà tôi chia sẻ với máy ảo. Trong máy ảo đó, tôi muốn sử dụng bảo vệ để theo dõi các thay đổi của tệp và thực hiện một số hành động nếu bất kỳ tệp nào trong số đó thay đổi.

Tôi thiết lập bảo vệ đúng cách và khi thay đổi tệp chia sẻ từ bên trong máy ảo, nó hoạt động tốt và chạy các tập lệnh thích hợp. Nhưng, nếu tôi cố gắng thay đổi tệp được chia sẻ từ máy chủ của mình, sự kiện thay đổi tệp này không lan truyền và bảo vệ không phản ứng.

Đây là cách thư mục chia sẻ mơ hồ của tôi trông như thế nào (những thứ khá bình thường)

local_config.vm.share_folder "app", "/var/www/app/current", "../app"

Tôi thậm chí đã thử sử dụng chia sẻ NFS ( :nfs => true) nhưng không được.

Có cách nào để thực hiện các sự kiện thay đổi tập tin truyền từ máy chủ sang máy ảo không? Hay đây là một cái gì đó có bản chất Vagrant / VirtualBox?

CẬP NHẬT:

Sau một vài thử nghiệm, tôi đã cài đặt ZenTest gem, có chứa công cụ tự động cho phép chức năng tương tự liên quan đến các sự kiện thay đổi tệp.

Khi chạy autotest trong máy ảo và thay đổi tệp từ máy chủ của tôi, những thay đổi này được lan truyền và phản ứng tự động .

Dựa trên điều này, có vẻ như việc truyền sự kiện thay đổi tập tin là một vấn đề của bảo vệ, không phải là hộp mơ hồ hoặc ảo.

Tôi đã không nhìn vào sự khác biệt thực hiện giữa bảo vệ và tự động mặc dù.

Bây giờ tôi biết có thể bắt các sự kiện thay đổi tập tin từ máy chủ trong máy ảo. Có ai có bất kỳ ý tưởng về làm thế nào để đạt được điều này bằng cách sử dụng bảo vệ? Tôi thích bảo vệ hơn vì DSL và khả năng sử dụng chung của nó.

Câu trả lời:


10

Nguyên nhân sâu xa là VirtualBox không xếp tầng các sự kiện thay đổi tệp trên máy chủ sang VM. Guard (trên Linux) đang mong đợi nhận được thông báo thông qua các sự kiện inotify. Thay vào đó, bạn có thể có cuộc thăm dò bảo vệ cho các sự kiện với guard -p, nhưng điều này có thể dẫn đến tối đa CPU của bạn, vì vậy bạn có thể điều tiết cuộc bỏ phiếu trở lại với guard -p -l 10.

Từ guard help start:

  -l, [--latency=Overwrite Listen's default latency]
  -p, [--force-polling=Force usage of the Listen polling listener]

http://www.softr.li/blog/2012/07/21/rucky-guard-over-vagrant


Cảm ơn Gabe, tôi đã rời khỏi bảo vệ cho watchr một thời gian trước đây. Tuy nhiên, câu trả lời của bạn là có giá trị cho sự hiểu biết.
ndamborsky

4

Tôi biết đây là một câu hỏi cũ hơn, nhưng đây là một câu trả lời cập nhật hơn:

-o/--listen-onTài liệu tùy chọn bảo vệ

Dán ở đây để tham khảo nhanh:

-o/--listen-on option

Use Listen's network functionality to receive file change events from the
network. This is most useful for virtual machines (e.g. Vagrant) which have
problems firing native filesystem events on the guest OS.

Suggested use:

On the host OS, you need to listen to filesystem events and forward them to
your VM using the listen script:

    $ listen -f 127.0.0.1:4000

Remember to configure your VM to forward the appropriate ports, e.g.
in Vagrantfile:

    config.vm.network :forwarded_port, guest: 4000, host: 4000

Then, on your guest OS, listen to the network events but ensure you
specify the host path:

    $ bundle exec guard -o '10.0.2.2:4000' -w '/projects/myproject'

1

Nếu bất cứ ai gặp phải vấn đề này và bảo vệ vẫn không hoạt động ...

Tôi đã kết thúc bằng watchr . Nó là một thay thế để bảo vệ. Sự kiện tuyên truyền từ máy chủ đến máy khách hoạt động ok trong watchr. Nó cũng linh hoạt hơn autotest.


Events propagation from host to guest machine works ok in watchr.Làm sao? Nó có sử dụng bỏ phiếu không? Nếu VirtualBox không truyền bá các sự kiện, làm sao nó biết khi nào một tệp đã thay đổi?
Nateowami
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.