Bir dosya değiştiğinde komut yürüt


9

Belirli bir klasöre .csv dosyaları yüklediğim bir senaryom var, / tmp / data_upload, her gün ve eski dosyalar yenisiyle değiştiriliyor.

Veri yüklendikten sonra bir Python komut dosyası çalıştırmam gerekiyor. Bunun için, bir cron işi oluşturmak ve dosyadaki değişiklikleri izlemek için bir fikrim var. İnotify kullanmayı denedim, ancak Unix etki alanına çok fazla değilim. Bunu nasıl yapabilirim?

Yükleme klasöründe, örneğin, / tmp / data_upload bir dosyada bir tarih değişikliği olduğunda komut dosyası test.py yürütmek gerekiyor.


Eradman.com/entrproject sitesine baktınız mı , kendim denemedim ama ilişkili olabilir.
OO

Bilginize, Python'da inotifykullanılabilir kütüphaneler var. Bir örnek için cevaplarımdan birine bakın: askubuntu.com/a/939392/295286
Sergiy Kolodyazhnyy

Yanıtlar:


10

Dosyalardaki değişiklikleri izleyecek ve ardından komut dosyaları yürütecek olan incrond'a (inotify cron daemon) ihtiyacınız olabilir.

Incrond, yeni dosya ekleme, değiştirme, silme ve daha pek çok şeyi izleyebilir. Bu makale , incrond'un hangi örnekle izleyebileceğini gösteren bir makaledir .

Örneğiniz için, dosyayı /etc/incron.d/data_uploadiçindekilerle oluşturabilirsiniz

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

2
Bu teorik olarak soruyu cevaplayabilse de , cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantı sağlamak tercih edilir.
Gerald Schneider

Hatırlattığınız için teşekkürler, bağlantının içeriğini ekledim.
victoroloan

Cevabınız için teşekkürler, sadece incrontab shoudl yükledikten sonra adımları doğrulamak için incrontab -eroot olarak yürütün ve sonra bu satırı ekleyin /tmp/data_upload IN_CREATE,IN_MODIFY test.py ? Ben yeni bir dosya yükledikten sonra kontrol etmek için test.py dosyasını yürütmek gerekir? test.py dosyasını nereye yerleştirmeliyim? bunun için mutlak yol sağlamam gerekir mi?
Alex

1
Bence, senaryonuz için mutlak yolu koymak daha iyi olacak. Komut dosyası çalışmıyorsa cron veya sistem günlüğünü de kontrol edebilirsiniz
victoroloan

Kod bloğunuzla hangi dosyayı belirttiğinizi de belgeleyebilir misiniz, Incrond sözdizimine aşina olmayan kişiler (benim gibi) komut satırında yürütmeniz gereken bir komuta
başvurduğunu düşünebilir


0

watchexec( Https://crates.io/crates/watchexec ) komut satırı yardımcı sesler Ben makinenizde yüklü Pas inşa araçları gerekiyordu yüklemek için inanmak rağmen bu olabilir böylece, gerek tam olarak ne gibi Oyunbozan


1
Pasla yazılmış yazılımı kullanmayı seviyorum çünkü 2004'te terk edilmediğini biliyorsunuz. Neredeyse yeni olmak zorunda.
Nathaniel Pisarski

0

Benim genel yaklaşımım klasik Unix aracıyla uğraşmak olacaktır find. Örneğin, komut

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

.csviçinde /tmp/upload_databir günden daha az bir süre önce değiştirilmiş olan dosyaları bulur ve buluyorsa, dosyayı çalıştırır test.py. Tabii ki, test.pydosyanız başka bir dizindeyse, dosya yolunuzu buna göre güncellemek istersiniz.

İşinizi crongünde bir kereden daha sık çalıştırırsanız, değişikliklerden bu yana en uzun süreyi dakika cinsinden belirtmek için bu mminseçeneği kullanabilirsiniz find. Örneğin,

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

.csv60 dakikadan daha kısa bir süre önce değiştirilen dosyaları arayacaktır - cron işi saatlik olarak çalıştırıyorsa yararlıdır.

İki adil uyarı vardır: Birincisi, bu .csvtamamen sildiğiniz dosyaları yakalamaz . Bunları ayrı ayrı kontrol etmek isteyebilirsiniz. İkincisi, bunların hiçbirini test etmek için zamanım yoktu. Kodumda kendiniz hata ayıklamanız gerekecek yazım hatalarını bekleyin.


1
Nedir -cmdsözdizimi? IIRC findalır -exec cmd ;...
D.Ben Knoble

Bunu bu soruyu göndermeden önce denedim, bu cron işlerinin art arda 2. 3'ünde düzgün çalışmıyor
Alex

@D. Ben Knoble: Haklısın. Bulma-iç komutlarını kabuk komutlarıyla karıştırdım. Sabit. Düzeltme için teşekkürler!
Thomas Blankenhorn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.