Ich habe ein Szenario, in dem ich jeden Tag CSV-Dateien in einen bestimmten Ordner / tmp / data_upload hochlade und die alten Dateien durch die neuen ersetzt werden.
Ich muss ein Python-Skript ausführen, sobald die Daten hochgeladen wurden. Zu diesem Zweck habe ich die Idee, einen Cron-Job zu erstellen und die Änderungen in der Datei zu überwachen. Ich habe versucht, inotify zu verwenden, aber ich bin nicht sehr in der Unix-Domäne. Wie kann ich das machen?
Ich muss das Skript test.py ausführen, sobald sich das Datum einer Datei im Upload-Ordner ändert, z. B. / tmp / data_upload.
inotify
Bibliotheken zur Verfügung. Sehen Sie eine meiner Antworten hier für ein Beispiel: askubuntu.com/a/939392/295286Antworten:
Möglicherweise benötigen Sie Incrond (Inotify Cron Daemon), das Änderungen an Dateien überwacht und dann Skripte ausführt.
Incrond kann das Hinzufügen neuer Dateien, das Ändern, Löschen und vieles mehr überwachen. Dieser Artikel zeigt anhand eines Beispiels, welche Ereignisinkrondheit überwacht werden kann.
Beispiel für Ihren Fall, Sie könnten die Datei
/etc/incron.d/data_upload
mit dem Inhalt erstellenquelle
incrontab -e
als Root ausführen und dann diese Zeile einschließen/tmp/data_upload IN_CREATE,IN_MODIFY test.py
? Damit ich nach dem Hochladen einer neuen Datei überprüfen kann, ob die Datei test.py ausgeführt werden soll. Wo soll ich die Datei test.py ablegen? sollte ich dafür einen absoluten Pfad angeben müssen?Sie können entr verwenden , um das Skript bei jeder Änderung einer Datei automatisch auszuführen, indem Sie
ls /tmp/data_upload | entr -p script.py
es beim Start einmal ausführen .Projektwebsite: http://eradman.com/entrproject/
Online-Manpage: https://www.systutorials.com/docs/linux/man/1-entr/
quelle
Das Befehlszeilenprogramm
watchexec
( https://crates.io/crates/watchexec ) klingt genau so, wie Sie es benötigen. Ich glaube jedoch, dass für die Installation die Rust-Build-Tools auf Ihrem Computer installiert sein müssen Dealbreakerquelle
Mein allgemeiner Ansatz wäre es, mit dem klassischen Unix-
find
Dienstprogramm herumzuspielen. Zum Beispiel der Befehlfindet alle
.csv
Dateien/tmp/upload_data
, die vor weniger als einem Tag geändert wurden, und führt Ihre aus,test.py
wenn es welche findet. Wenn sich Ihretest.py
Datei in einem anderen Verzeichnis befindet, möchten Sie natürlich Ihren Pfad entsprechend aktualisieren.Wenn Sie Ihren
cron
Job öfter als einmal am Tag ausführen , können Sie mit diesermmin
Optionfind
die maximale Zeit seit der Änderung in Minuten angeben. Zum Beispiel,sucht nach
.csv
Dateien, die vor weniger als 60 Minuten geändert wurden - nützlich, wenn cron den Job stündlich ausführt.Zwei faire Warnungen sind angebracht: Erstens werden dadurch keine
.csv
Dateien abgefangen, die Sie vollständig gelöscht haben. Möglicherweise möchten Sie diese separat prüfen. Zweitens hatte ich keine Zeit, dies zu testen. Erwarten Sie Tippfehler in meinem Code, die Sie selbst debuggen müssen.quelle
-cmd
Syntax? IIRCfind
nimmt-exec cmd ;
...