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

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

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

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

5 ответов

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

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

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

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

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

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

Справочная страница в Интернете: https://www.systutorials.com/docs/linux/man/1-entr/

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

Попробуйте посмотретьiwatch(только для Linux, из-за inotify) илиfswatchкоманды.

Вероятно, вам необходимо установить их на свой компьютер. т.е. для Debian Linux (выпуск книжного червя) это так же просто, как

      sudo aptitude install iwatch

или

      sudo aptitude install fswatch

Мой общий подход заключается в том, чтобы возиться с классическим 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 файлы, которые вы полностью удалили. Вы можете проверить это отдельно. Во-вторых, у меня не было времени проверить это. Ожидайте опечаток в моем коде, которые вам придется отлаживать самостоятельно.

Другие вопросы по тегам