Цей посібник розкриє, як використовувати сповіщення файлової системи Linux, щоб отримувати миттєві повідомлення про появу нових файлів у певному каталозі. Ці сповіщення можуть слугувати тригерами для автоматизації рутинних операцій у вашій системі.
Ми створимо скрипт, який буде відстежувати вказаний каталог і реагувати на додавання нових файлів. Кожен виявлений файл буде автоматично заархівований і переміщений до іншого каталогу. Скрипт буде використовувати підсистему inotify за допомогою утиліти inotify-tools. Але спочатку нам потрібно встановити необхідні інструменти та провести кілька експериментів.
Інсталяція inotify-tools та gzip
Для користувачів Ubuntu та інших дистрибутивів на базі Debian, встановіть пакет, скориставшись apt-get. Для інших дистрибутивів Linux використовуйте відповідний менеджер пакетів.
sudo apt-get install inotify-tools gzip
Експерименти з inotify-tools
Почнімо з моніторингу каталогу та аналізу подій, які виникають при додаванні нових файлів. Ми скористаємося утилітою inotifywatch, яка є частиною inotify-tools. Спочатку створимо новий каталог під назвою “incoming”:
mkdir incoming
Запустіть моніторинг цього каталогу за допомогою команди:
inotifywatch -v incoming
Це накаже inotify відстежувати всі події файлової системи в каталозі “incoming”. Опція -v виводить додаткову інформацію про роботу інструменту. Ми не задали час очікування (-t), тому команда буде збирати події, доки ми її не зупинимо комбінацією клавіш CTRL+C. На даний момент ваш термінал повинен виглядати приблизно так:
Відкрийте нове вікно терміналу (або вкладку) та перейдіть до каталогу “incoming”. Створіть новий файл під назвою “newfile” за допомогою команди touch.
cd incoming/ touch newfile
Поверніться до першого вікна терміналу та зупиніть inotifywatch натисканням CTRL+C.
В консолі буде виведено таблицю подій, яка покаже по одному екземпляру подій “create”, “open”, “attrib” та “close_write”. Ці чотири події відбулися, коли ми використовували touch для створення нового файлу, встановлювали його атрибути доступу, відкривали його для запису нульового символу та потім закривали. Це лише декілька з багатьох подій, які можна відстежувати у файловій системі за допомогою inotify-tools. Повний перелік можна знайти на сторінці man inotifywatch.
Для наших цілей нас цікавлять лише дві події:
“create” – коли файл створюється у цільовому каталозі.
“moved_to” – коли файл переміщується з іншого місця до цільового каталогу.
Спробуємо inotifywatch ще раз, але цього разу попросимо його відстежувати лише ці дві події. Запустіть таку команду у першому вікні терміналу:
inotifywatch -v -e create -e moved_to incoming
У другому вікні або вкладці терміналу спробуйте створити новий файл, змінити його вміст, а потім перемістити файл з іншого місця в цільовий каталог. Усі ці команди виконуються з домашнього каталогу.
touch incoming/created echo Testing123 >> incoming/created touch /tmp/created2 mv /tmp/created2 incoming/
Поверніться до першого вікна терміналу та зупиніть inotifywatch, натиснувши CTRL+C. Ви побачите наступний результат:
Зафіксовано тільки дві події: створення файлу під назвою “created” та переміщення існуючого файлу під назвою “created2”. Всі інші дії, такі як зміна “created”, були проігноровані.
Моніторинг каталогу та виконання дій
Тепер, коли ми знаємо, які події відстежувати, ми можемо скористатися іншим інструментом, inotifywait, щоб заблокувати виконання програми до тих пір, поки файл не буде створений або переміщений до нашого цільового каталогу. Ми будемо використовувати ті самі аргументи, що і для inotifywatch, а також вкажемо формат імені файлу, який буде використовуватися в нашій задачі.
Перш ніж почати, нам потрібен каталог для зберігання файлів, які вже були оброблені. Створіть каталог під назвою “processed”:
mkdir processed
Далі створіть новий скрипт під назвою “watch-incoming.sh” та додайте до нього наступний вміст:
#!/bin/bash TARGET=~/incoming/ PROCESSED=~/processed/ inotifywait -m -e create -e moved_to --format "%f" $TARGET | while read FILENAME do echo Detected $FILENAME, moving and zipping mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME" gzip "$PROCESSED/$FILENAME" done
Скрипт запускає команду inotifywait з опцією -m, що змушує моніторинг працювати безперервно. Кожного разу, коли виявляється нова подія, ім’я файлу передається в команду read і зберігається в змінній “FILENAME”. Потім виконується блок коду в циклі while, де файл спочатку переміщується в каталог “processed”, а потім стискається. Оригінальний файл замінюється стисненою версією, а його ім’я закінчується на “.gz”.
Дамо права на виконання цього скрипту та запустимо його з нашого домашнього каталогу.
chmod u+x watch-incoming.sh ./watch-incoming.sh
Відкрийте друге вікно терміналу та створіть новий файл у каталозі “incoming”. Перевірте вміст як “incoming”, так і “processed”, щоб побачити результати спрацювання подій:
Текстовий файл, який ми скопіювали до каталогу “incoming”, був виявлений скриптом, переміщений до “processed” та стиснений за допомогою gzip.
Тепер ми можемо виконувати різноманітні завдання, використовуючи моніторинг нових файлів, що надходять до каталогу. Наприклад, ми можемо додавати водяні знаки до зображень, стискати відео у формат mp4 і навіть завантажувати кожен новий файл до відра Amazon S3. Цей скрипт є гарною відправною точкою для розробки власних робочих процесів та автоматизації рутинних задач у вашій системі.