Hướng dẫn dùng linux inotify trong PHP

Tiện ích inotify là một công cụ hiệu quả để theo dõi và thông báo các thay đổi của hệ thống tập tin. Bạn có thể chỉ định danh sách các tệp và thư mục cần được inotify theo dõi. Thư viện này được sử dụng bởi nhiều chương trình khác. Ví dụ, mô-đun CPAN Linux :: Inotify được phát triển dựa trên thư viện này.

Nội dung chính

  • iNotify Dòng thực thi
  • Thông báo sự kiện
  • Các mô-đun / thư viện được đề xuất cho iNotify
  • Chương trình mẫu C để theo dõi sự kiện thay đổi tệp / thư mục

  • iNotify Dòng thực thi
  • Thông báo sự kiện
  • Các mô-đun / thư viện được đề xuất cho iNotify
  • Chương trình mẫu C để theo dõi sự kiện thay đổi tệp / thư mục

iNotify Dòng thực thi

Ở cấp độ cao, bạn thực hiện như sau với tiện ích inotify.

  • Tạo danh sách giám sát inotify. Thêm các thư mục / tệp mong muốn vào danh sách giám sát inotify. Danh sách giám sát có thể được thay đổi khi cần thiết
  • Yêu cầu Inotify báo cáo các thay đổi sự kiện cụ thể vào danh sách giám sát các tệp và thư mục. Ví dụ: yêu cầu inotify báo cáo BẬT TRUY CẬP, BẬT MỞ, BẬT VIẾT, BẬT ĐÓNG, v.v.,

Sau đây là các chức năng inotify và vai trò tương ứng của chúng.

  • Tạo phiên bản thông báo bằng cách inotify_init[].
  • Thêm tất cả các thư mục được theo dõi vào danh sách thông báo bằng cách sử dụng inotify_add_watch[] hàm số.
  • Để xác định các sự kiện đã xảy ra, hãy làm đọc[] trên phiên bản inotify. Việc đọc này sẽ bị chặn cho đến khi sự kiện thay đổi xảy ra. Bạn nên thực hiện đọc có chọn lọc trên phiên bản inotify này bằng cách sử dụng lựa chọn[] cuộc gọi.
  • Đọc trả về danh sách các sự kiện đã xảy ra trên các thư mục được giám sát. Dựa trên giá trị trả về của read [], chúng ta sẽ biết chính xác loại thay đổi nào đã xảy ra.
  • Trong trường hợp xóa đồng hồ trên các thư mục / tệp, hãy gọi inotify_rm_watch [].

Hãy cẩn thận khi sử dụng mô-đun này với hệ thống tệp NFS. Nó có thể không xác định các sự kiện thay đổi danh sách giám sát có chứa tệp / thư mục từ hệ thống tệp NFS.

Thông báo sự kiện

Sau đây là các sự kiện thông báo có sẵn:

  • IN_ACCESS – Tệp đã được truy cập
  • IN_ATTRIB – Siêu dữ liệu đã thay đổi [quyền, dấu thời gian, thuộc tính mở rộng, v.v.]
  • IN_CLOSE_WRITE – Tệp được mở để ghi đã bị đóng
  • IN_CLOSE_NOWRITE – Tệp không được mở để ghi đã bị đóng
  • IN_CREATE – Tệp / thư mục được tạo trong thư mục đã xem
  • IN_DELETE – Tệp / thư mục bị xóa khỏi thư mục đã xem
  • IN_DELETE_SELF – Bản thân tệp / thư mục đã xem đã bị xóa
  • IN_MODIFY – Tệp đã được sửa đổi
  • IN_MOVE_SELF – Bản thân tệp / thư mục đã xem đã được di chuyển
  • IN_MOVED_FROM – Tệp được chuyển ra khỏi thư mục đã xem
  • IN_MOVED_TO – Tệp được chuyển vào thư mục đã xem
  • IN_OPEN – Tệp đã được mở

Các mô-đun / thư viện được đề xuất cho iNotify

Đảm bảo rằng mô-đun libc6 2.3.6 được cài đặt trên hệ thống của bạn. Nếu bạn đã cài đặt phiên bản trước của mô-đun libc, bạn sẽ nhận được thông báo lỗi sau khi biên dịch chương trình c giám sát inotify.

error: linux/inotify.h: No such file or directory

Kiểm tra phiên bản libc6 trên hệ thống của bạn và nâng cấp nó nếu cần.


# dpkg -l libc6

Chương trình mẫu C để theo dõi sự kiện thay đổi tệp / thư mục

/*This is the sample program to notify us for the file creation and file deletion takes place in /tmp*/ #include #include #include #include #include #define EVENT_SIZE [ sizeof [struct inotify_event] ] #define EVENT_BUF_LEN [ 1024 * [ EVENT_SIZE + 16 ] ] int main[ ] { int length, i = 0; int fd; int wd; char buffer[EVENT_BUF_LEN]; /*creating the INOTIFY instance*/ fd = inotify_init[]; /*checking for error*/ if [ fd < 0 ] { perror[ "inotify_init" ]; } /*adding the /tmp into watch list. Here, the suggestion is to validate the existence of the directory before adding into monitoring list.*/ wd = inotify_add_watch[ fd, "/tmp", IN_CREATE | IN_DELETE ]; /*read to determine the event change happens on /tmp. Actually this read blocks until the change event occurs*/ length = read[ fd, buffer, EVENT_BUF_LEN ]; /*checking for error*/ if [ length < 0 ] { perror[ "read" ]; } /*actually read return the list of change events happens. Here, read the change event one by one and process it accordingly.*/ while [ i < length ] { struct inotify_event *event = [ struct inotify_event * ] &buffer[ i ]; if [ event->len ] { if [ event->mask & IN_CREATE ] { if [ event->mask & IN_ISDIR ] { printf[ "New directory %s created.n", event->name ]; } else { printf[ "New file %s created.n", event->name ]; } } else if [ event->mask & IN_DELETE ] { if [ event->mask & IN_ISDIR ] { printf[ "Directory %s deleted.n", event->name ]; } else { printf[ "File %s deleted.n", event->name ]; } } } i += EVENT_SIZE + event->len; } /*removing the /tmp from the watch list.*/ inotify_rm_watch[ fd, wd ]; /*closing the INOTIFY instance*/ close[ fd ]; }

Đã đánh dấu với:
thông báo cho Java,
thông báo cho Linux,
thông báo cho python,
thông báo cho Solaris,
thông báo cho Ubuntu,
inotify Unix,
thông báo cho Windows

Chủ Đề