Назад | Перейти на главную страницу

Выполнять команду при изменении файла

У меня есть сценарий, при котором я загружаю файлы .csv в определенную папку / tmp / data_upload каждый день, а старые файлы заменяются новыми.

Мне нужно запустить скрипт Python после загрузки данных. Для этого у меня есть идея создать задание cron и отслеживать изменения в файле. Я пробовал использовать inotify, но я не очень разбираюсь в области Unix. Как я могу это сделать?

Мне нужно выполнить скрипт test.py, когда есть изменение даты файла в папке загрузки, например, / tmp / data_upload.

Вам может понадобиться incrond (демон inotify cron), который будет отслеживать изменения в файлах, а затем выполнять сценарии.

Incrond может отслеживать добавление нового файла, изменение, удаление и многое другое. Это статья показывает, какое событие incrond может отслеживать на некотором примере.

Пример для вашего случая, вы можете создать файл /etc/incron.d/data_upload с содержанием

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

Вы могли бы использовать вход для автоматического запуска скрипта каждый раз при изменении файла, запустив ls /tmp/data_upload | entr -p script.py один раз при запуске.

Сайт проекта: http://eradman.com/entrproject/

Страница онлайн-руководства: https://www.systutorials.com/docs/linux/man/1-entr/

Мой общий подход - возиться с классическим Unix find утилита. Например, команда

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

найдет любой .csv файлы в /tmp/upload_data которые были изменены менее одного дня назад, и запустите test.py если найдет. Конечно, если ваш test.py файл находится в каком-то другом каталоге, вы хотите соответствующим образом обновить свой путь к нему.

Если вы запустите свой cron работу чаще, чем один раз в день, вы можете использовать mmin возможность find указать максимальное время с момента изменения в минутах. Например,

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

будет искать .csv файлы, которые были изменены менее 60 минут назад - полезно, если cron выполняет задание ежечасно.

Два честных предупреждения: во-первых, это не поймает .csv файлы, которые вы полностью удалили. Вы можете проверить их отдельно. Во-вторых, у меня не было времени все это проверить. Ожидайте опечаток в моем коде, которые вам придется отлаживать самостоятельно.

В watchexec (https://crates.io/crates/watchexec) утилита командной строки звучит именно так, как вам нужно, хотя я считаю, что для ее установки вам понадобятся инструменты сборки Rust, установленные на вашем компьютере, так что это может быть решающим фактором