Thực thi lệnh khi một tập tin thay đổi


9

Tôi có một kịch bản trong đó tôi đang tải các tệp .csv lên một thư mục cụ thể, / tmp / data_upload, mỗi ngày và các tệp cũ được thay thế bằng tệp mới.

Tôi cần chạy tập lệnh Python sau khi dữ liệu được tải lên. Đối với điều này, tôi có một ý tưởng để tạo một công việc định kỳ và theo dõi những thay đổi trong tệp. Tôi đã thử sử dụng inotify, nhưng tôi không biết nhiều về miền Unix. Làm thế nào tôi có thể làm điều đó?

Tôi cần phải thực thi tập lệnh test.txt khi có sự thay đổi ngày của một tệp trong thư mục tải lên, ví dụ: / tmp / data_upload.


Bạn đã xem eradman.com/entrproject chưa từng thử nhưng có vẻ như nó có thể liên quan.
OO

FYI, Python có inotifythư viện có sẵn. Xem một trong những câu trả lời của tôi ở đây để biết ví dụ: Askubfox.com/a/939392/295286
Sergiy Kolodyazhnyy

Câu trả lời:


10

Bạn có thể cần incrond (inotify cron daemon) sẽ theo dõi các thay đổi trên các tệp và sau đó thực thi các tập lệnh.

Incrond có thể theo dõi thêm tập tin mới, sửa đổi, xóa và nhiều hơn nữa. Đây là một bài viết cho thấy những gì sự kiện incrond có thể theo dõi với một số ví dụ.

Ví dụ cho trường hợp của bạn, bạn có thể tạo tệp /etc/incron.d/data_uploadcó nội dung

/tmp/data_upload IN_CREATE,IN_MODIFY /path/to/test.py 

2
Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Gerald Schneider

Cảm ơn đã nhắc nhở tôi, tôi đã thêm bối cảnh cho liên kết.
victoroloan

Cảm ơn câu trả lời, chỉ cần xác minh các bước sau khi cài đặt incrontab shoudl thực thi incrontab -evới quyền root rồi bao gồm dòng này /tmp/data_upload IN_CREATE,IN_MODIFY test.py ? Vì vậy, để kiểm tra một khi tôi tải lên một tệp mới, nó có nên thực thi tệp test.txt không? Tôi nên đặt tệp test.txt ở đâu? tôi có nên cung cấp đường dẫn tuyệt đối cho việc này không?
Alex

1
Tôi nghĩ, sẽ tốt hơn nếu đặt đường dẫn tuyệt đối cho kịch bản của bạn. Bạn cũng có thể kiểm tra cron hoặc nhật ký hệ thống nếu tập lệnh dường như không hoạt động
victoroloan

Bạn cũng có thể ghi lại tập tin nào bạn đang đề cập đến với khối mã của mình không, những người không quen thuộc với cú pháp của Incrond (như tôi) có thể nghĩ rằng đang đề cập đến một lệnh mà bạn phải thực hiện trên dòng lệnh
Ferrybig


0

Các watchexec( https://crates.io/crates/watchexec ) dòng lệnh tiện ích âm thanh thích chính xác những gì bạn cần, mặc dù tôi tin để cài đặt nó, bạn sẽ cần phải có Rust xây dựng được cài đặt trên máy tính của bạn các công cụ, do đó có thể là một người giải quyết


1
Tôi thích sử dụng phần mềm được viết bằng rỉ sét vì bạn biết rằng nó không bị bỏ rơi vào năm 2004 hoặc một cái gì đó. Nó gần như phải mới.
Nathaniel Pisarski

0

Cách tiếp cận chung của tôi sẽ là findsử dụng tiện ích Unix cổ điển . Ví dụ: lệnh

find /tmp/upload_data/*.csv -mtime -1 -exec /home/myname/test.py

sẽ tìm thấy bất kỳ .csvtập tin /tmp/upload_datanào đã được sửa đổi ít hơn một ngày trước và chạy của bạn test.pynếu nó tìm thấy bất kỳ tập tin nào. Tất nhiên, nếu test.pytệp của bạn nằm trong một số thư mục khác, bạn muốn cập nhật đường dẫn của mình cho phù hợp.

Nếu bạn điều hành croncông việc của mình thường xuyên hơn một lần một ngày, bạn có thể sử dụng mmintùy chọn findđể chỉ định thời gian tối đa kể từ khi sửa đổi trong vài phút. Ví dụ,

find /tmp/upload_data/*.csv -mmin -60 -exec /home/myname/test.py

sẽ tìm kiếm .csvcác tệp đã được sửa đổi ít hơn 60 phút trước - hữu ích nếu cron chạy công việc hàng giờ.

Hai cảnh báo công bằng theo thứ tự: Thứ nhất, điều này sẽ không bắt được .csvcác tệp mà bạn đã xóa hoàn toàn. Bạn có thể muốn kiểm tra riêng biệt. Thứ hai, tôi không có thời gian để kiểm tra bất kỳ thứ gì trong số này. Yêu cầu lỗi chính tả trong mã của tôi mà bạn sẽ phải tự sửa lỗi.


1
Là gì -cmdcú pháp? IIRC findmất -exec cmd ;...
D. Ben Knoble

Tôi đã thử cái này trước khi đăng câu hỏi này, cái này không hoạt động đúng vào lần thứ 2 liên tiếp của công việc cron
Alex

@D. Ben Knoble: Bạn nói đúng. Tôi trộn lẫn các lệnh find-Internal với các lệnh shell. Đã sửa. Cảm ơn vì sự đúng đắn của bạn!
Thomas Blankenhorn
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.