Befehl ausführen, wenn sich eine Datei ändert

9

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.

Alex
quelle
Haben Sie sich eradman.com/entrproject angesehen , es nicht selbst ausprobiert, aber es sieht so aus, als ob es verwandt sein könnte.
OO
Zu Ihrer Information, Python hat inotifyBibliotheken zur Verfügung. Sehen Sie eine meiner Antworten hier für ein Beispiel: askubuntu.com/a/939392/295286
Sergiy Kolodyazhnyy

Antworten:

10

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_uploadmit dem Inhalt erstellen

/tmp/data_upload IN_CREATE,IN_MODIFY /path/to/test.py 
Victoroloan
quelle
2
Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Gerald Schneider
Vielen Dank, dass Sie mich daran erinnert haben, dass ich den Kontext für den Link hinzugefügt habe.
Victoroloan
Vielen Dank für die Antwort, nur um die Schritte nach der Installation von Incrontab zu überprüfen, sollten Sie incrontab -eals 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?
Alex
1
Ich denke, es wird besser sein, den absoluten Pfad für Ihr Skript anzugeben. Sie können auch Cron oder Systemprotokoll überprüfen, wenn das Skript nicht funktioniert
Victoroloan
Können Sie auch dokumentieren, auf welche Datei Sie sich mit Ihrem Codeblock beziehen? Personen, die mit der Syntax von Incrond nicht vertraut sind (wie ich), denken möglicherweise, dass sie sich auf einen Befehl beziehen, den Sie in der Befehlszeile ausführen müssen
Ferrybig
0

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 Dealbreaker

Ben Sandeen
quelle
1
Ich liebe es, in Rost geschriebene Software zu verwenden, weil Sie wissen, dass sie 2004 nicht aufgegeben wurde oder so. Es muss fast neu sein.
Nathaniel Pisarski
0

Mein allgemeiner Ansatz wäre es, mit dem klassischen Unix- findDienstprogramm herumzuspielen. Zum Beispiel der Befehl

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

findet alle .csvDateien /tmp/upload_data, die vor weniger als einem Tag geändert wurden, und führt Ihre aus, test.pywenn es welche findet. Wenn sich Ihre test.pyDatei in einem anderen Verzeichnis befindet, möchten Sie natürlich Ihren Pfad entsprechend aktualisieren.

Wenn Sie Ihren cronJob öfter als einmal am Tag ausführen , können Sie mit dieser mminOption finddie maximale Zeit seit der Änderung in Minuten angeben. Zum Beispiel,

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

sucht nach .csvDateien, 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 .csvDateien 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.

Thomas Blankenhorn
quelle
1
Wie ist die -cmdSyntax? IIRC findnimmt -exec cmd ;...
D. Ben Knoble
Ich habe es versucht, bevor ich diese Frage gestellt habe. Dies funktioniert nicht richtig beim 2. 3. aufeinanderfolgenden Durchlauf von Cron-Jobs
Alex
@D. Ben Knoble: Du hast recht. Ich habe find-interne Befehle mit Shell-Befehlen verwechselt. Fest. Danke für die Korrektur!
Thomas Blankenhorn