Có một vài vấn đề với một số inotifywaitcá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.txttệ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_tocá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\nbartậ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 đó inotifywaitsẽ đợ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
inotifywaitchạ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.txttrong 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.txtthư 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, /tmpcó 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.txtcái đã được tạo ra nhưng /new-name-for-the-original-tmp/sleep.txtthay vào đó. Một /tmpthư 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.