Wykonaj polecenie, gdy plik się zmieni

9

Mam scenariusz, w którym każdego dnia przesyłam pliki .csv do określonego folderu / tmp / data_upload, a stare pliki są zastępowane nowym.

Po przesłaniu danych muszę uruchomić skrypt w języku Python. W tym celu mam pomysł, aby utworzyć zadanie cron i monitorować zmiany w pliku. Próbowałem użyć inotify, ale nie jestem zbytnio zainteresowany domeną Unix. Jak mogę to zrobić?

Muszę wykonać skrypt test.py, gdy nastąpi zmiana daty pliku w folderze przesyłania, na przykład / tmp / data_upload.

Alex
źródło
Czy przejrzałeś już eradman.com/entrproject , nie próbowałem go sam, ale wygląda na to, że może być powiązany.
OO
Do Twojej wiadomości, Python ma inotifydostępne biblioteki. Zobacz jedną z moich odpowiedzi tutaj na przykład: askubuntu.com/a/939392/295286
Sergiy Kolodyazhnyy

Odpowiedzi:

10

Może być potrzebny incrond (demon cot inotify), który będzie monitorował zmiany w plikach, a następnie wykonywał skrypty.

Incrond może monitorować dodawanie nowego pliku, modyfikowanie, usuwanie i wiele innych. W tym artykule pokazano, jakie zdarzenia incrond może monitorować na przykładzie.

Przykładem przypadku może być utworzenie pliku /etc/incron.d/data_uploadz zawartością

/tmp/data_upload IN_CREATE,IN_MODIFY /path/to/test.py 
victoroloan
źródło
2
Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
Gerald Schneider
Dziękujemy za przypomnienie, dodałem kontekst linku.
victoroloan
Dzięki za odpowiedź, tylko po to, aby zweryfikować kroki po instalacji incrontab shoudl wykonać incrontab -ejako root, a następnie dołączyć tę linię /tmp/data_upload IN_CREATE,IN_MODIFY test.py ? aby sprawdzić, czy po przesłaniu nowego pliku powinien wykonać plik test.py? gdzie powinienem umieścić plik test.py? czy powinienem podać bezwzględną ścieżkę do tego?
Alex
1
Myślę, że lepiej będzie podać bezwzględną ścieżkę do skryptu. Możesz również sprawdzić cron lub dziennik systemowy, jeśli skrypt wydaje się nie działać
victoroloan
Czy potrafisz również udokumentować plik, do którego się odwołujesz za pomocą bloku kodu, ludzie, którzy nie znają składni Incrond (jak ja), mogą myśleć, że odnoszą się do polecenia, które musisz wykonać w wierszu poleceń
Ferrybig
0

W watchexec( https://crates.io/crates/watchexec ) Linia komend dźwięki Narzędzie jak dokładnie to, co trzeba, chociaż uważam go zainstalować trzeba by mieć narzędzia kompilacji Rust zainstalowane na komputerze, dzięki czemu może być łamacz

Ben Sandeen
źródło
1
Uwielbiam korzystać z oprogramowania napisanego w rdzy, ponieważ wiesz, że nie zostało ono porzucone w 2004 roku. To prawie musi być nowy.
Nathaniel Pisarski
0

Moje ogólne podejście polegałoby na majstrowaniu przy klasycznym findnarzędziu uniksowym . Na przykład polecenie

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

znajdzie wszystkie .csvpliki /tmp/upload_data, które zostały zmodyfikowane mniej niż dzień temu, i uruchomi test.pyje, jeśli je znajdzie. Oczywiście, jeśli twój test.pyplik znajduje się w innym katalogu, chcesz odpowiednio zaktualizować swoją ścieżkę do niego.

Jeśli wykonujesz cronzadanie częściej niż raz dziennie, możesz użyć mminopcji, findaby określić maksymalny czas od modyfikacji w minutach. Na przykład,

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

wyszuka .csvpliki, które zostały zmodyfikowane mniej niż 60 minut temu - przydatne, jeśli cron uruchamia zadanie co godzinę.

Dwa uczciwe ostrzeżenia są w porządku: Po pierwsze, nie złapie .csvplików, które zostały całkowicie usunięte. Możesz je sprawdzić osobno. Po drugie, nie miałem czasu na testowanie tego. Oczekuj literówek w moim kodzie, które będziesz musiał samodzielnie debugować.

Thomas Blankenhorn
źródło
1
Jaka jest -cmdskładnia? IIRC findbierze -exec cmd ;...
D. Ben Knoble
Próbowałem tego przed opublikowaniem tego pytania, to nie działa poprawnie przy 2. 3. z kolei serii zadań crona
Alex
@RE. Ben Knoble: Masz rację. Pomieszałem polecenia find-internal z poleceniami powłoki. Naprawiony. Dziękuję za poprawienie mnie!
Thomas Blankenhorn,