Một tập lệnh shell có thể đợi một tập tin thay đổi và hành động không?


12

Tôi tự hỏi nếu tôi có thể viết một tập lệnh sẽ theo dõi sự thay đổi trong một tập tin và thực hiện một số hành động khi phát hiện thay đổi.

Giải thích chi tiết:

  1. OpenVPN ghi trạng thái của nó vào một tệp cứ sau 1 phút.
  2. Tôi cần phân tích tệp trạng thái này và thực hiện hành động.
  3. OpenVPN cắt ngắn tệp trạng thái trước khi ghi vào nó.
  4. Tôi đã thử viết vào một đường ống có tên, nhưng tôi nhận được các lỗi không mong muốn (nhưng không gây tử vong) trong ứng dụng khi nó không thể cắt được đường ống.

Trong trường hợp sửa đổi thực sự gắn vào tệp, treo trên tail -fcó lẽ là cách dễ nhất. Nhưng chỉ để nối thêm.
SF.

Câu trả lời:


21

Cách bẩn n 'giá rẻ:

Lặp lại stat -c %Y filevà hành động khi thời gian sửa đổi thay đổi.

Có lẽ tốt hơn:

Sử dụng dịch vụ cron inotify để theo dõi các sự kiện sửa đổi tệp và chạy hành động của bạn:

/path/to/your/file IN_MODIFY /path/to/your/script $#

+1 cho giải pháp thứ hai
Michael Lowman


2

inotify sẽ là cách đúng đắn để làm điều đó. Các hướng dẫn được đưa ra trong một số ấn bản tạp chí LinuxForYou cho câu hỏi này.


0

Vì vậy, có một kịch bản:

1) Kiểm tra thời gian sửa đổi trên tệp (với stat)
2) Nếu thời gian sửa đổi mới hơn lần kiểm tra cuối cùng, nó đã thay đổi
3) Phân tích cú pháp và thực hiện hành động của bạn
4) Khác ngủ trong 1 phút và sau đó ngủ lại


0

Cách nhanh và bẩn:

function wait_file_changed {
    tail -fn0 "$1" | head -n1
}

wait_file_changed /tmp/potato
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.