Виконай команду, коли файл змінюється


9

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

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

Мені потрібно виконати скрипт test.py, коли в папці завантаження буде змінена дата, наприклад, / tmp / data_upload.


Ви подивилися на eradman.com/entrproject , не спробували його самостійно, але, схоже, це може бути пов'язано.
ОО

FYI, Python має inotifyдоступні бібліотеки. Дивіться одну з моїх відповідей тут на приклад: askubuntu.com/a/939392/295286
Сергій Колодяжний

Відповіді:


10

Можливо, вам знадобиться інкордон (ініціювати демон cron), який буде стежити за змінами у файлах та виконувати сценарії.

Incrond може відслідковувати додавання нового файлу, змінювати, видаляти та багато іншого. Ця стаття показує, яку приклад може контролювати на прикладі.

Приклад для вашого випадку, ви можете створити файл /etc/incron.d/data_uploadіз вмістом

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

2
Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Джеральд Шнайдер

Дякую, що нагадали, я додав контекст для посилання.
victoroloan

Дякуємо за відповідь, просто щоб перевірити дії після встановлення виконуваного incrontab shoudl incrontab -eяк root, а потім включити цей рядок /tmp/data_upload IN_CREATE,IN_MODIFY test.py ? щоб перевірити, коли я завантажую новий файл, він повинен виконати файл test.py? куди слід розмістити файл test.py? Чи потрібно мені забезпечити абсолютний шлях для цього?
Олексій

1
Я думаю, що буде краще прокласти абсолютний шлях для вашого сценарію. Ви також можете перевірити cron або системний журнал, якщо сценарій, здається, не працює
victoroloan

Чи можете ви також задокументувати, на який файл ви посилаєтесь з кодовим блоком, люди, які не знайомі з синтаксисом Incrond (як я), можуть подумати, що вони посилаються на команду, яку потрібно виконати в командному рядку
Ferrybig,


0

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


1
Мені подобається використовувати програмне забезпечення, написане в іржі, тому що ви знаєте, що його не відмовились у 2004 році. Це майже має бути новим.
Натаніел

0

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

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


1
Що таке -cmdсинтаксис? IIRC findприймає -exec cmd ;...
D. Ben Knoble

Я спробував це перед тим, як опублікувати це запитання, це не працює належним чином у другому третьому поспіль запуску завдань з крон
Олексій

@D. Бен Нобл: Ти маєш рацію. Я змішав внутрішні команди пошуку з командними оболонками. Виправлено. Дякуємо за виправлення!
Томас Бланкенхорн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.