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