🐧 Как выполнить команду при изменении файла в системах Linux?

Мануал

Вы попали по адресу, если хотите узнать, как запускать команды Linux при изменении любого файла в рабочем каталоге и при создании новых файлов.

В Linux вы можете использовать cron, чтобы запланировать выполнение команд в определенное время.

Но что если вам нужно, чтобы команды выполнялись каждый раз, когда файл изменяется или в каталог добавляется новый файл?

Это также легко выполнимо, и для этого существуют некоторые инструменты командной строки.

Давайте приступим!

watchexec

watchexec – это удобный и автономный инструмент, который отслеживает заданный рабочий каталог и выполняет команду, если обнаруживает какие-либо изменения, например, обновление файлов или создание новых файлов.

Особенности

  • Не требует сложной командной строки, включающей xargs (расширенные аргументы).
  • Проверяет изменения в текущем каталоге и всех подкаталогах в режиме реального времени.
  • Нет необходимости в языковой среде выполнения, и она не связана с каким-либо конкретным языком или экосистемой.
  • По умолчанию используются .gitignore и .ignore, чтобы решить, для каких файлов игнорировать уведомления.
  • Группы процессов используются для отслеживания развилок программ.
  • Поддерживается наблюдение за файлами с определенным расширением.
  • Он совместим с OS X, Linux и Windows.
  • Возможна фильтрация и игнорирование событий на основе glob (шаблонов поиска файлов для нахождения частично идентичных имен файлов.

Установка watchexec

Чтобы легко установить инструмент watchexec, вставьте следующую ссылку в терминал или интерпретатор командной строки и нажмите Enter.

Linux и macOS

curl -sS https://webinstall.dev/watchexec | bash

После успешной установки на экране отобразится путь.

В моем случае этот инструмент был установлен в /root/.local/bin

# curl -sS https://webinstall.dev/watchexec | bash

Thanks for using webi to install 'watchexec@stable' on 'Linux/x86_64'.
Have a problem? Experience a bug? Please let us know:
        https://github.com/webinstall/webi-installers/issues

Lovin' it? Say thanks with a Star on GitHub:
        https://github.com/webinstall/webi-installers

Found /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz
Extracting /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz
Installing to /root/.local/opt/watchexec-vcli-v1.18.9/bin/watchexec
Installed 'watchexec vcli-v1.18.9' as /root/.local/bin/watchexec

После установки перейдите в хранилище .local/bin и проверьте наличие или отсутствие файла с помощью этих команд.

cd .local/bin

ls

Следующим шагом будет экспорт пути для использования инструмента watchexec.

export PATH="/root/.local/bin:$PATH"
Для запуска просто введите watchexec в терминале от имени пользователя root.
Используйте эту команду, чтобы посмотреть, какие флаги и опции можно использовать с инструментом watchexec.
watchexec --help

Примеры команд

Вызывайте команду ls -la при изменении любого файла в данном каталоге/подкаталоге.

Эта команда показывает все файлы, присутствующие в каталоге, всякий раз, когда обнаруживает любое изменение.

watchexec -- ls -la

При изменении любого из файлов расширений python, js, CSS или Html в текущем каталоге выполните эту команду.

Здесь вы можете передать любую команду.

Расширения файлов должны быть разделены запятой.

 watchexec --exts py,js,css,html <command>
Запуск команды при изменении любого файла в lib или src.
Опция “-w” следит за определенным файлом или каталогом в системе.
watchexec -w lib -w src <command>

Вызов/перезапуск любой службы при изменении любого файла в текущем каталоге (и всех подкаталогах).

watchexec -e html -r tor

watchexec -e js,py -r mysql

Здесь опция “-r” перезапускает процесс или службу, если она запущена в системе.

entr

entr – это простая и отличная утилита командной строки для запуска произвольных команд при возникновении любых изменений в заданном каталоге.

“entr” означает Event Notify Test Runner.

Этот инструмент был создан с целью быстрой обратной связи и автоматизированного тестирования.

Установка

entr предустановлен в дистрибутиве Linux.

В случае его отсутствия, вам необходимо установить его вручную.

Этот инструмент прост в использовании и может быть установлен с помощью следующей команды.

sudo apt-get install entr
Также вы можете установить его, клонировав официальный Git-репозиторий.
git clone https://github.com/eradman/entr.git

Затем перейдите в этот каталог и установите необходимые требования с помощью следующих команд.

./configure
make test
make install

Для просмотра доступных вариантов сборки выполните команду ./configure -h

Примеры команд

Чтобы просмотреть опции и аргументы, доступные для команды entr.
Используйте следующую команду.
man entr

Эта команда выводит на экран руководство пользователя для команды entr.

NAME
     entr — run arbitrary commands when files change

SYNOPSIS
     entr [-acdnprsz] utility [argument /_ ...]

DESCRIPTION
     A list of files provided on standard input, and the utility is executed using the supplied arguments
     if any of them change.  entr waits for the child process to finish before responding to subsequent
     file system events.  A TTY is also opened before entering the watch loop in order to support interac‐
     tive utilities.

     The arguments are as follows:

     -a      Respond to all events which occur while the utility is running.  Without this option, entr
             consolidates events in order to avoid looping.  This option has no effect in conjunction with
             the -r flag.

     -c      Clear the screen before invoking the utility specified on the command line.  Specify twice to
             erase the scroll back buffer.

     -d      Track the directories of regular files provided as input and exit if a new file is added.
             This option also enables directories to be specified explicitly.  If specified twice, all new
             entries to a directory are recognized, otherwise files with names beginning with ‘.’ are ig‐
             nored.

     -n      Run in non-interactive mode.  In this mode entr does not attempt to read from the TTY or
             change its properties.

     -p      Postpone the first execution of the utility until a file is modified.

 Manual page entr(1) line 1 (press h for help or q to quit)

Для запуска и автоматической перезагрузки сервера MySQL при изменении любого файла JavaScript в рабочем каталоге.

Каждый раз, когда изменения сохраняются в файле, entr перезагружает сервер MySQL.

 ls *.js | entr -r mysql
Чтобы автоматически перезагрузить веб-сервер или завершить работу в случае выхода сервера.
$ ls * | entr -rz ./httpd

Заключение

Я надеюсь, что эта статья была вам полезна для изучения того, как запускать команды Linux при изменении любого файла в заданном каталоге и при создании новых файлов.
см. также:

Добавить комментарий