2011-09-27 23 views

Trả lời

25

Inotify chính nó là một mô-đun hạt nhân accesible thông qua các cuộc gọi từ ví dụ. một chương trình C. http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/

Có một bộ ứng dụng được gọi inotify-công cụ, trong đó có:

inotifywait - chờ đợi những thay đổi các tập tin sử dụng inotify

http://linux.die.net/man/1/inotifywait

inotifywatch - thu thập thống kê truy cập hệ thống tập tin sử dụng inotify

http://linux.die.net/man/1/inotifywatch

Bạn có thể sử dụng inotify trực tiếp từ dòng lệnh, ví dụ như thế này để liên tục theo dõi cho tất cả những thay đổi dưới thư mục chính (có thể tạo ra rất nhiều đầu ra):

inotifywait -r -m $HOME 

Và đây là một kịch bản theo dõi liên tục và phản ứng với nhật ký hoạt động Apache, sao chép từ các tập tin người đàn ông của inotifywait:

#!/bin/sh 
while inotifywait -e modify /var/log/messages; do 
    if tail -n1 /var/log/messages | grep httpd; then 
    kdialog --msgbox "Apache needs love!" 
    fi 
done 
+10

Ví dụ được cung cấp không thực sự theo dõi "liên tục" như đã nêu trên câu hỏi. Nó thoát khỏi sự kiện đầu tiên. Trong thực tế, một số sự kiện có thể bị bỏ qua trong khi phần bên trong của 'do' đang được thực thi. – Unode

+2

Không chỉ chúng có thể bị bỏ qua như @Unode đã nói, mà còn việc khởi tạo diễn ra mỗi lần thay đổi xảy ra, vì vậy nó không phải là một phương pháp hiệu quả. – Wernight

+0

Để làm rõ, các nhận xét của @Unode và Wernight chỉ áp dụng cho ví dụ cuối cùng trong bài đăng (kịch bản để phản ứng với các sự kiện nhật ký Apache). – depquid

11

Dưới đây là những gì tôi sử dụng để xem các thao tác trên một tệp riêng lẻ. "-m" gây ra giám sát và thoát chỉ sau một sự kiện. Để có được dấu thời gian, bạn cần ít nhất 3.13 phiên bản của công cụ inotify, nhưng nếu điều đó không quan trọng (hoặc không có sẵn trên hệ điều hành của bạn hoặc khó cập nhật) bạn có thể bỏ qua các tùy chọn định dạng và thời gian. "Cat /etc/resolv.conf" trong vỏ khác dẫn đến những kết quả dưới đây:

$ inotifywait -m --timefmt '%H:%M' --format '%T %w %e %f' /etc/resolv.conf 

Setting up watches. 
Watches established. 
12:49 /etc/resolv.conf OPEN 
12:49 /etc/resolv.conf ACCESS 
12:49 /etc/resolv.conf CLOSE_NOWRITE,CLOSE 

inotifywait có các tùy chọn để theo dõi các thư mục là tốt, vì vậy hãy kiểm manpage. Thêm -r cho đệ quy để theo dõi trẻ em của một thư mục.

Dưới đây là một ví dụ với các lệnh tôi đã gõ trong một cửa sổ khác nhau hiển thị với "->" prefix:

$ inotifywait -mr --timefmt '%H:%M' --format '%T %w %e %f' /home/acarwile/tmpdir 
Setting up watches. Beware: since -r was given, this may take a while! 
Watches established. 

-> cd into directory, no info 
-> ls in directory 
13:15 /home/acarwile/tmpdir/ OPEN,ISDIR 
13:15 /home/acarwile/tmpdir/ CLOSE_NOWRITE,CLOSE,ISDIR 

-> touch newfile 
13:16 /home/acarwile/tmpdir/ CREATE newfile 
13:16 /home/acarwile/tmpdir/ OPEN newfile 
13:16 /home/acarwile/tmpdir/ ATTRIB newfile 
13:16 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE newfile 

-> mv newfile renamedfile 
13:16 /home/acarwile/tmpdir/ MOVED_FROM newfile 
13:16 /home/acarwile/tmpdir/ MOVED_TO renamedfile 

-> echo hello >renamedfile 
13:16 /home/acarwile/tmpdir/ MODIFY renamedfile 
13:16 /home/acarwile/tmpdir/ OPEN renamedfile 
13:16 /home/acarwile/tmpdir/ MODIFY renamedfile 
13:16 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE renamedfile 

-> touch renamedfile 
13:17 /home/acarwile/tmpdir/ OPEN renamedfile 
13:17 /home/acarwile/tmpdir/ ATTRIB renamedfile 
13:17 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE renamedfile 

-> rm renamedfile 
13:17 /home/acarwile/tmpdir/ DELETE renamedfile 

-> cd ..; rmdir tmpdir 
13:17 /home/acarwile/tmpdir/ DELETE_SELF 

Sau khi ở trên, tôi đã cố gắng để làm lại tmpdir ("mkdir tmpdir") nhưng đã không có đầu ra từ đó. Tmpdir mới không phải là cùng thư mục với tmpdir cũ. Thời gian để chỉ^C và dừng itnotifywait.

2

Như tôi đã nói trên https://superuser.com/a/747574/28782, tôi đã thực hiện một kịch bản helper sử dụng inotifywait mà không cần một số hạn chế trực tiếp của nó: inotifyexec

dụ sử dụng (giả sử bạn đã thêm nó vào đường dẫn hệ thống của bạn như thực thi):

inotifyexec "echo test" -r . 
Các vấn đề liên quan