Có một vài vấn đề với một số inotifywait
cách tiếp cận dựa trên cơ sở được đưa ra cho đến nay:
- họ không tìm thấy
sleep.txt
tệp đã được tạo trước tiên dưới dạng tên tạm thời và sau đó được đổi tên thành sleep.txt
. Một nhu cầu phù hợp cho moved_to
các sự kiện ngoàicreate
- Tên tệp có thể chứa các ký tự dòng mới, in tên của các tệp mới được phân tách bằng dòng là không đủ để xác định nếu một
sleep.txt
đã được tạo. Điều gì nếu một foo\nsleep.txt\nbar
tập tin đã được tạo ra ví dụ?
- Điều gì xảy ra nếu tập tin được tạo trước đó
inotifywait
đã được khởi động và cài đặt đồng hồ? Sau đó inotifywait
sẽ đợi mãi cho một tập tin đã ở đây. Bạn cần chắc chắn rằng tập tin chưa có ở đó sau khi đồng hồ đã được cài đặt.
- một số giải pháp vẫn
inotifywait
chạy (ít nhất là cho đến khi tệp khác được tạo) sau khi tìm thấy tệp.
Để giải quyết những vấn đề đó, bạn có thể làm:
sh -c 'echo "$$" &&
LC_ALL=C exec inotifywait -me create,moved_to --format=/%f/ . 2>&1' | {
IFS= read pid &&
while IFS= read -r line && [ "$line" != "Watches established." ]; do
: wait for watches to be established
done
[ -e sleep.txt ] || [ -L sleep.txt ] || grep -qxF /sleep.txt/ && kill "$pid"
}
Lưu ý rằng chúng tôi đang theo dõi việc tạo sleep.txt
trong thư mục hiện tại, .
(vì vậy bạn sẽ làmcd /tmp || exit
trước đây trong ví dụ của mình). Thư mục hiện tại không bao giờ thay đổi, vì vậy khi đường ống đó trả về thành công, đó là sleep.txt
thư mục hiện tại đã được tạo.
Tất nhiên, bạn có thể thay thế .
bằng /tmp
ở trên, nhưng trong khi inotifywait
đang chạy, /tmp
có thể đã được đổi tên nhiều lần (không chắc /tmp
, nhưng có thể xem xét trong trường hợp chung) hoặc hệ thống tệp mới được gắn trên nó, vì vậy khi đường ống trở lại, nó có thể không là một /tmp/sleep.txt
cái đã được tạo ra nhưng /new-name-for-the-original-tmp/sleep.txt
thay vào đó. Một /tmp
thư mục mới cũng có thể đã được tạo trong khoảng thời gian đó và thư mục đó sẽ không được xem, do đó, một thư mục sleep.txt
được tạo sẽ không bị phát hiện.
$MAILPATH
.