Sử dụng inotify để theo dõi một thư mục nhưng không hoạt động 100%


10

Tôi đã viết một tập lệnh bash để theo dõi một thư mục cụ thể /root/secondfolder/:

#!/bin/sh

while inotifywait -mr -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

Khi tôi tạo ra một tập tin gọi fourth.txttrong /root/secondfolder/và ghi thứ với nó, tiết kiệm và gần nó, nó kết quả đầu ra như sau:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

Tuy nhiên, nó không lặp lại "close_write". Tại sao vậy?

Câu trả lời:


16

inotifywait -m là chế độ "màn hình" : nó không bao giờ thoát. Shell chạy nó và chờ mã thoát để biết có nên chạy phần thân của vòng lặp hay không, nhưng điều đó không bao giờ đến.

Nếu bạn loại bỏ -m, nó sẽ hoạt động:

while inotifywait -r -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

sản xuất

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/root/secondfolder/ CLOSE_WRITE,CLOSE bar
close_write
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
...

Theo mặc định, inotifywait sẽ "thoát sau khi sự kiện đầu tiên xảy ra", đó là những gì bạn muốn trong một điều kiện vòng lặp.


Thay vào đó, bạn có thể thích đọc đầu ra tiêu chuẩn của inotifywait:

#!/bin/bash

while read line
do
    echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")

Kịch bản (bash) này sẽ đọc từng dòng đầu ra của inotifywaitlệnh vào $linebiến bên trong vòng lặp, sử dụng thay thế quy trình . Nó tránh thiết lập đồng hồ đệ quy mỗi lần xung quanh vòng lặp, có thể tốn kém. Nếu bạn không thể sử dụng bash, bạn có thể chuyển lệnh vào vòng lặp : inotifywait ... | while read line .... inotifywaittạo một dòng đầu ra cho mỗi sự kiện trong chế độ này, vì vậy vòng lặp chạy một lần cho mỗi sự kiện.


2
Đường ống lệnh vào vòng lặp hoạt động, cảm ơn!
mib1413456
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.