Eseguire il comando quando un file cambia


9

Ho uno scenario in cui sto caricando i file .csv in una cartella specifica, / tmp / data_upload, ogni giorno, e i vecchi file vengono sostituiti da quello nuovo.

Devo eseguire uno script Python una volta caricati i dati. Per questo, ho un'idea per creare un lavoro cron e monitorare le modifiche nel file. Ho provato a usare inotify, ma non sono molto nel dominio Unix. Come lo posso fare?

Devo eseguire lo script test.py una volta che c'è una modifica della data di un file nella cartella di caricamento, ad esempio / tmp / data_upload.


Hai visto eradman.com/entrproject , non l'ho provato da solo ma sembra che potrebbe essere correlato.
OO

Cordiali saluti, Python ha inotifylibrerie disponibili. Vedi una delle mie risposte qui per un esempio: askubuntu.com/a/939392/295286
Sergiy Kolodyazhnyy

Risposte:


10

Potrebbe essere necessario incrond (inotify cron daemon) che monitorerà le modifiche sui file e quindi eseguirà gli script.

Incrond può monitorare aggiungere nuovi file, modificare, eliminare e molti altri. Questo articolo mostra quali eventi possono essere monitorati con qualche esempio.

Esempio per il tuo caso, potresti creare il file /etc/incron.d/data_uploadcon i contenuti

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

2
Mentre questo può teoricamente rispondere alla domanda, sarebbe preferibile includere le parti essenziali del risposta qui, e fornire il link di riferimento.
Gerald Schneider,

Grazie per avermelo ricordato, ho aggiunto il contesto per il link.
vittoroloan,

Grazie per la risposta, solo per verificare i passaggi dopo l'installazione di incrontab, eseguire incrontab -ecome root quindi includere questa riga /tmp/data_upload IN_CREATE,IN_MODIFY test.py ? in modo che per controllare una volta caricato un nuovo file dovrebbe eseguire il file test.py? dove devo posizionare il file test.py? dovrei fornire un percorso assoluto per questo?
Alex

1
Penso che sarà meglio mettere il percorso assoluto per la tua sceneggiatura. Puoi anche controllare cron o registro di sistema se lo script sembra non funzionare
victoroloan

Puoi anche documentare a quale file ti riferisci con il tuo blocco di codice, le persone che non hanno familiarità con la sintassi di Incrond (come me) potrebbero pensare che si riferiscano a un comando che devi eseguire sulla riga di comando
Ferrybig


0

L' utilità della riga di comando watchexec( https://crates.io/crates/watchexec ) sembra esattamente ciò di cui hai bisogno, anche se credo che per installarla dovresti avere gli strumenti di compilazione Rust installati sul tuo computer, quindi potrebbe essere un dealbreaker


1
Adoro usare software scritto in ruggine perché sai che non è stato abbandonato nel 2004 o qualcosa del genere. Deve quasi essere nuovo.
Nathaniel Pisarski,

0

Il mio approccio generale sarebbe quello di giocherellare con la classica findutility Unix . Ad esempio, il comando

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

troverà tutti i .csvfile /tmp/upload_datache sono stati modificati meno di un giorno fa ed eseguirà il tuo test.pyse ne trova uno. Naturalmente, se il test.pyfile si trova in un'altra directory, si desidera aggiornare il percorso di conseguenza.

Se si esegue il cronlavoro più spesso di una volta al giorno, è possibile utilizzare l' mminopzione findper specificare il tempo massimo dalla modifica in minuti. Per esempio,

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

cercherà i .csvfile che sono stati modificati meno di 60 minuti fa, utile se cron esegue il lavoro ogni ora.

Sono in ordine due avvertimenti corretti: in primo luogo, questo non catturerà i .csvfile che hai completamente eliminato. Si consiglia di verificarli separatamente. In secondo luogo, non ho avuto il tempo di testare nulla di tutto ciò. Aspettati errori di battitura nel mio codice che dovrai eseguire il debug da solo.


1
Qual è la -cmdsintassi? IIRC findprende -exec cmd ;...
D. Ben Knoble

Ho provato questo prima di pubblicare questa domanda, questo non funziona correttamente sulla seconda terza serie consecutiva di lavori cron
Alex

@D. Ben Knoble: hai ragione. Ho confuso i comandi find-internal con i comandi shell. Fisso. Grazie per la correzione!
Thomas Blankenhorn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.