Jalankan perintah ketika file berubah

9

Saya memiliki skenario di mana saya mengunggah file .csv ke folder tertentu, / tmp / data_upload, setiap hari, dan file-file lama digantikan oleh yang baru.

Saya perlu menjalankan skrip Python setelah data diunggah. Untuk ini, saya punya ide untuk membuat pekerjaan cron dan memonitor perubahan dalam file. Saya mencoba menggunakan inotify, tetapi saya tidak banyak ke domain Unix. Bagaimana saya bisa melakukan itu?

Saya perlu menjalankan script test.py setelah ada perubahan tanggal pada file di folder unggah, misalnya, / tmp / data_upload.

Alex
sumber
Sudahkah Anda melihat eradman.com/entrproject , belum mencobanya sendiri tetapi sepertinya itu terkait.
OO
FYI, Python memiliki inotifyperpustakaan yang tersedia. Lihat salah satu jawaban saya di sini untuk contoh: askubuntu.com/a/939392/295286
Sergiy Kolodyazhnyy

Jawaban:

10

Anda mungkin perlu incrond (inotify cron daemon) yang akan memonitor perubahan pada file dan kemudian menjalankan skrip.

Incrond dapat memonitor menambahkan file baru, memodifikasi, menghapus, dan banyak lagi. Ini adalah artikel yang menunjukkan peristiwa apa yang dapat dipantau dengan beberapa contoh.

Contoh untuk kasus Anda, Anda dapat membuat file /etc/incron.d/data_uploaddengan konten

/tmp/data_upload IN_CREATE,IN_MODIFY /path/to/test.py 
victoroloan
sumber
2
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Gerald Schneider
Terima kasih telah mengingatkan saya, saya telah menambahkan konteks untuk tautan.
victorolo
Terima kasih atas jawabannya, hanya untuk memverifikasi langkah-langkah setelah menginstal incrontab harus dilakukan incrontab -esebagai root lalu sertakan baris ini /tmp/data_upload IN_CREATE,IN_MODIFY test.py ? sehingga untuk memeriksa setelah saya mengunggah file baru itu harus menjalankan file test.py? di mana saya harus meletakkan file test.py? haruskah saya memberikan jalur absolut untuk ini?
Alex
1
Saya pikir, akan lebih baik untuk meletakkan jalur absolut untuk skrip Anda. Anda juga dapat memeriksa cron atau log sistem jika skrip tampaknya tidak berfungsi
victoroloan
Bisakah Anda juga mendokumentasikan file apa yang Anda maksud dengan blok kode Anda, orang-orang yang tidak terbiasa dengan sintaks Incrond (seperti saya) mungkin berpikir mengacu pada perintah yang harus Anda jalankan pada baris perintah
Ferrybig
0

The watchexec( https://crates.io/crates/watchexec ) suara utilitas baris perintah seperti apa yang Anda butuhkan, meskipun saya percaya untuk menginstalnya Anda akan perlu untuk memiliki Rust membangun alat yang diinstal pada komputer Anda, sehingga mungkin pelanggar transaksi

Ben Sandeen
sumber
1
Saya suka menggunakan perangkat lunak yang ditulis dalam karat karena Anda tahu itu tidak ditinggalkan pada tahun 2004 atau apalah. Hampir harus baru.
Nathaniel Pisarski
0

Pendekatan umum saya adalah mengutak-atik findutilitas Unix klasik . Misalnya, perintahnya

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

akan menemukan .csvfile apa pun /tmp/upload_datayang telah dimodifikasi kurang dari satu hari yang lalu, dan jalankan file Anda test.pyjika ada. Tentu saja, jika test.pyfile Anda ada di direktori lain, Anda ingin memperbarui jalur Anda ke sana.

Jika Anda menjalankan cronpekerjaan Anda lebih sering dari sekali sehari, Anda dapat menggunakan mminopsi finduntuk menentukan waktu maksimal sejak modifikasi dalam hitungan menit. Sebagai contoh,

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

akan mencari .csvfile yang dimodifikasi kurang dari 60 menit yang lalu - berguna jika cron menjalankan pekerjaan setiap jam.

Ada dua peringatan yang adil: Pertama, ini tidak akan menangkap .csvfile yang Anda hapus sepenuhnya. Anda mungkin ingin memeriksa ini secara terpisah. Kedua, saya tidak punya waktu untuk menguji semua ini. Harapkan kesalahan ketik dalam kode saya yang harus Anda debug sendiri.

Thomas Blankenhorn
sumber
1
Apa itu -cmdsintaks? IIRC findmengambil -exec cmd ;...
D. Ben Knoble
Saya sudah mencoba yang ini sebelum memposting pertanyaan ini, ini tidak berfungsi dengan baik pada ke-2 berturut-turut pekerjaan cron
Alex
@D. Ben Knoble: Anda benar. Saya mencampur perintah find-internal dengan perintah shell. Tetap. Terima kasih atas koreksinya!
Thomas Blankenhorn