Фатмавати Ахмад Заенури/Shutterstock.com
Из этого туториала Вы узнаете, как использовать события файловой системы Linux (уведомлять), чтобы получать уведомления каждый раз, когда файл появляется в каталоге. Вы можете использовать их как триггеры для автоматизации общих задач в вашей системе.
Мы собираемся написать скрипт, который следит за каталогом и воздействует на новые добавляемые файлы. Каждый файл распаковывается и перемещается в другой каталог, как только он обнаружен. Скрипт использует подсистему inotify через утилиту inotify-tools. Но сначала давайте установим инструмент и поэкспериментируем.
Установка inotify-tools и gzip
Используйте apt-get
для установки этого пакета в вашу систему, если вы используете Ubuntu или другой дистрибутив на основе Debian. В других дистрибутивах Linux используйте инструмент управления пакетами вашего дистрибутива Linux.
sudo apt-get установить inotify-tools gzip
Экспериментируя с inotify-tools
Давайте начнем с просмотра каталога и выяснения, какие события инициируются при поступлении новых файлов. Мы будем использовать инструмент под названием inotifywatch
, который является частью inotify-tools. Создайте новый каталог с именем «входящие»:
входящий mkdir
Начните смотреть этот каталог, выполнив следующую команду:
inotifywatch -v входящие
Это даст команду inotify следить за всеми событиями файловой системы во «входящем» каталоге. Опция -v
позволяет инструменту распечатывать дополнительную информацию о том, что он делает. Мы не указали опцию тайм-аута (- t
), и команда будет продолжать собирать события, пока мы не завершим работу с помощью CTRL + C. На этом этапе наш терминал должен выглядеть примерно так:
Откройте новое окно терминала (или вкладку) и перейдите во входящий каталог. Используйте команду touch, чтобы создать новый файл с именем «newfile».
cd входящий/коснитесь нового файла
Теперь вернитесь к первому окну терминала и остановите inotifywatch, нажав CTRL + C.
Таблица событий будет передана на консоль с указанием одного экземпляра «create», «open», «attrib» и «close_write». Эти четыре события произошли, когда мы использовали touch для создания нового файла, установки его доступа к файлу. атрибуты, открыл его, чтобы написать нулевой завершающий символ, а затем закрыл его позже. Это лишь некоторые из множества событий, которые можно отслеживать в файловой системе с помощью инструментов inotify. Вы можете увидеть полный список на главной странице inotifywatch.
Для наших целей нас интересуют только два события:
- «Создать» – когда файл создается в целевой директории.
- «Move_to» – когда файл перемещается из другого места в целевой каталог.
Давайте попробуем inotifywatch еще раз, но на этот раз проинструктируем его отслеживать только эти два события. Запустите эту команду в первом окне терминала:
inotifywatch -v -e создать -e перемещенный_в входящий
Во втором окне или вкладке терминала давайте попробуем создать новый файл, изменить его содержимое, а затем переместить файл из другого места в целевой каталог. Все эти команды запускаются из домашнего каталога.
нажмите входящий/созданный echo Testing123 >> входящий/созданный Touch/TMP/создал2 mv/tmp/создал2 входящий/
Вернитесь к первому окну терминала и остановите inotifywatch, нажав CTRL + C. Мы увидим следующий вывод:
Были подсчитаны только два события: создание файла с именем «create.txt» и перемещение существующего файла с именем «made2.txt». Все остальное, например, изменение «create.txt», было проигнорировано.
Просмотр каталога и выполнение задачи
Теперь, когда мы знаем, какие события следует отслеживать, мы можем использовать другой инструмент под названием inotifywait
, чтобы блокировать выполнение, пока файл не будет создан или перемещен в наш целевой каталог. Мы будем использовать те же аргументы, что и для inotifywatch, а также указать, как мы хотим, чтобы имя файла было отформатировано для использования в нашей задаче.
Прежде чем мы начнем, нам нужен каталог для хранения файлов, которые уже были обработаны. Создайте каталог с именем «обработано»:
обработан mkdir
Затем создайте новый скрипт с именем «watch-incoming.sh» и добавьте содержимое, указанное ниже:
#!/Bin/Баш TARGET = ~/входящих/ОБРАБОТАННЫЙ = ~/обработке/inotifywait -m -e создать -e Move_to --format "% f" $ TARGET \ | пока читаю FILENAME делать Обнаружено эхо $ FILENAME, перемещение и архивирование mv "$ TARGET/$ FILENAME" "$ PROCESSED/$ FILENAME" gzip "$ PROCESSED/$ FILENAME" сделанный
Сценарий выполняет команду inotifywait
с параметром -m
. Это заставляет командный монитор меняться бесконечно. Каждый раз, когда обнаруживается новое событие, имя файла передается команде чтения и вводится в переменную «FILENAME».Выполняется блок в цикле while, в котором файл сначала перемещается в «обработанный» каталог, а затем распаковывается. Исходный файл заменяется сжатым файлом, а имя файла заканчивается на «.gz».
Давайте предоставим права на выполнение этого скрипта и запустим его из нашего домашнего каталога.
chmod u + x watch-incoming.sh ./watch-incoming.sh
Откройте второе окно терминала и создайте новый файл во «входящем» каталоге. Перечислите содержимое как «входящих», так и «обработанных» каталогов, чтобы увидеть результаты обнаруженного события:
Необработанный текстовый файл, который мы скопировали в «входящий» каталог, был обнаружен сценарием, скопирован в «обработанный» и затем сжат с помощью gzip.
Теперь мы можем выполнять некоторые интересные задачи, наблюдая за поступающими в каталог новыми файлами. Например, мы могли бы добавить водяной знак в файлы изображений, сжать необработанные видео в формате mp4 и даже загрузить каждый новый файл, который мы видим, в корзину Amazon S3. Этот сценарий является хорошей отправной точкой для развертывания ваших собственных рабочих процессов и автоматизации общих задач в вашей системе.