Тема сегодняшней статьи — автоматизация в Linux. Я покажу вам, как запустить выполнение определенных действий при появлении файла в каталоге Linux. Мы напишем скрипт, который следит за папкой и при появлении файла распакует его и переместит в другой каталог. Скрипт будет использовать inotify — компонент пакета инструментов inotify-tools.
Установка inotify-tools и gzip
Если вы используете Ubuntu или другой дистрибутив на основе Debian, тогда для установки inotify-tools в вашу операционную систему используйте apt-get . В других дистрибутивах Linux используйте инструмент управления пакетами вашего дистрибутива Linux.
1 |
sudo apt-get install inotify-tools gzip |
Использование inotify-tools
Давайте начнем с просмотра каталога и выяснения, какие события инициируются при появлении новых файлов. Создайте новый каталог с именем «incoming»:
1 |
mkdir incoming |
Запустите мониторинг этого каталога, выполнив команду:
1 |
inotifywatch -v incoming |
Команду прикажет inotify следить за всеми событиями в папке «incoming». Параметр -v заставляет инструмент выводить дополнительную информацию о том, что он делает. Если не указать параметр тайм-аута -t, команда будет собирать события до тех пор, пока мы не завершим работу с помощью CTRL + C. На этом этапе наш терминал должен выглядеть примерно так:
Откройте новое окно терминала (или вкладку) и перейдите в папку «incoming». Используйте команду touch, чтобы создать новый файл с именем «newfile».
1 2 |
cd incoming/ touch newfile |
Теперь вернитесь к первому окну терминала и остановите inotifywatch, нажав CTRL + C.
Таблица событий будет передана на консоль с указанием одного экземпляра «create», «open», «attrib» и «close_write». Эти четыре события произошли, когда мы использовали touch для создания нового файла и установки прав доступа к нему. Это лишь некоторые из множества событий, которые можно отследить в файловой системе с помощью инструментов inotify. Вы можете увидеть полный список на главной странице inotifywatch.
РЕКОМЕНДУЕМ:
Программы резервного копирования Linux
Для мониторинга папки на выполнение определенных действий при появлении файла в каталоге Linux нас интересуют два события:
- «create» — когда файл создается в целевой директории.
- «move_to» — когда файл перемещается из другого места в целевой каталог.
Давайте попробуем inotifywatch снова, но на этот раз прикажем ему мониторить только эти два события. Запустите эту команду в первом окне терминала:
1 |
inotifywatch -v -e create -e moved_to incoming |
Во втором окне или вкладке терминала давайте попробуем создать новый файл, изменить его содержимое, а затем переместить файл из другого места в целевой каталог. Все эти команды запускаются из домашнего каталога.
1 2 3 4 |
touch incoming/created echo Testing123 >> incoming/created touch /tmp/created2 mv /tmp/created2 incoming/ |
Вернитесь к первому окну терминала и остановите inotifywatch, нажав CTRL + C. Мы увидим следующий вывод:
Были подсчитаны только два события: создание файла с именем «create.txt» и перемещение существующего файла с именем «made2.txt». Все остальное, например, изменение «create.txt», было проигнорировано.
Мониторинг папки и выполнение задачи
Теперь, когда мы знаем, какие события следует отслеживать, мы можем использовать другой инструмент, называемый inotifywait, чтобы блокировать выполнение до тех пор, пока файл не будет создан или перемещен в наш целевой каталог. Мы будем использовать те же аргументы, что и для inotifywatch, а также укажем, как мы хотим, чтобы имя файла выглядело.
РЕКОМЕНДУЕМ:
Мониторинг в Linux с помощью командой строки
Прежде чем мы начнем, нам нужен каталог для хранения файлов, которые уже были обработаны. Создайте каталог с именем «processed» — обработано:
1 |
mkdir processed |
Затем создайте новый скрипт с именем «watch-incoming.sh» и добавьте в него следующее:
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/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. Каждый раз, когда обнаруживается новое событие, имя файла передается команде чтения и вводится в переменную «FILENAME». Выполняется блок в цикле while, в котором файл сначала перемещается в «обработанный» каталог, а затем распаковывается. Исходный файл заменяется сжатым файлом, а имя файла заканчивается на «.gz».
Давайте предоставим права на выполнение этого скрипта и запустим его из нашего домашнего каталога.
1 2 |
chmod u+x watch-incoming.sh ./watch-incoming.sh |
Откройте второе окно терминала и создайте новый файл во «входящем» каталоге. Перечислите содержимое как «входящего», так и «обработанного» каталога, чтобы увидеть результаты обнаруженного события:
Необработанный текстовый файл, который мы скопировали в папку «incoming», был обнаружен сценарием, скопирован в папку «processed» и затем сжат с помощью gzip.
Теперь мы можем выполнять некоторые интересные задачи. Например, мы могли бы наложить водяной знак на файлы изображений, сжать оригинальные видео в формат mp4 и даже загрузить каждый новый файл, который мы видим, в корзину Amazon S3. Этот сценарий является хорошей отправной точкой для развертывания ваших собственных рабочих процессов и автоматизации общих задач в вашей системе.