Jak provést příkaz při změně souboru v systému Linux?

Automatické spouštění příkazů v Linuxu při změnách souborů

Hledáte způsob, jak automaticky spouštět příkazy v Linuxu při jakékoli úpravě souboru či vytvoření nového v pracovním adresáři? Jste na správném místě.

V Linuxu je sice možné využívat nástroj cron pro plánování spouštění úloh v určený čas, avšak co dělat, když potřebujete okamžitou reakci na změny souborů?

I to je dosažitelné s pomocí specializovaných nástrojů příkazové řádky.

Pojďme se na ně podívat!

watchexec

watchexec je samostatný nástroj, který monitoruje zadaný pracovní adresář a v případě jakékoli změny (úprava, vytvoření) souboru automaticky spustí definovaný příkaz.

Vlastnosti

  • Nepotřebuje složité konstrukce s xargs.
  • Sleduje změny v reálném čase v aktuálním adresáři i podadresářích.
  • Není závislý na žádném konkrétním programovacím jazyce či ekosystému.
  • Standardně využívá soubory .gitignore a .ignore pro určení ignorovaných souborů.
  • Používá skupiny procesů pro sledování programů.
  • Umožňuje sledování souborů s konkrétními příponami.
  • Je kompatibilní s OS X, Linux a Windows.
  • Nabízí filtrování a ignorování událostí pomocí glob vzorců.

Instalace watchexec

Nástroj watchexec lze snadno nainstalovat pomocí následujícího příkazu v terminálu:

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

Po instalaci se na obrazovce zobrazí cesta k nástroji (např. v mém případě: /root/.local/bin).


┌──(root💀kali)-[~]
└─# curl -sS https://webinstall.dev/watchexec | bash

Thanks for using webi to install '[email protected]' 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

Následně se můžete přesvědčit, zda se soubor nachází v .local/bin:

cd .local/bin
ls

Pro plnohodnotné využití nástroje watchexec je nutné exportovat jeho cestu:

export PATH="/root/.local/bin:$PATH"

Nyní můžete nástroj watchexec spouštět v terminálu jako root. Parametry a možnosti nástroje zobrazíte příkazem:

watchexec --help

Příklady použití

  • Spuštění příkazu `ls -la` při každé změně souboru v adresáři/podadresáři:
watchexec -- ls -la
  • Spuštění definovaného příkazu při jakékoli změně souborů s příponami .py, .js, .css, nebo .html v aktuálním adresáři. Přípony souborů se oddělují čárkou:
watchexec --exts py,js,css,html <příkaz>
  • Spuštění příkazu při změně souboru v adresářích lib nebo src. Parametr `-w` určuje sledovaný soubor nebo adresář:
watchexec -w lib -w src <příkaz>
  • Restartování služby při změně jakéhokoli souboru v aktuálním adresáři (včetně podadresářů):
watchexec -e html -r tor
watchexec -e js,py -r mysql

Parametr `-r` slouží k restartování procesu nebo služby běžící v systému.

Další příklady naleznete v oficiálním repozitáři na GitHubu.

entr

entr je další užitečný nástroj, který umožňuje spouštět libovolné příkazy při změnách v zadaném adresáři.

Zkratka „entr“ znamená Event Notify Test Runner, a byl navržen pro rychlou zpětnou vazbu a automatizované testování.

Instalace

Nástroj entr by měl být ve většině distribucí Linuxu předinstalován. Pokud tomu tak není, nainstalujte jej pomocí:

sudo apt-get install entr

Alternativně lze nástroj nainstalovat naklonováním oficiálního Git repozitáře:

git clone https://github.com/eradman/entr.git

Poté přejděte do adresáře s klonovaným repozitářem a nainstalujte potřebné komponenty:

./configure
make test
make install

Dostupné možnosti sestavení zobrazíte příkazem: `./configure -h`

Příklady použití

Manuálovou stránku s informacemi o dostupných možnostech a argumentech zobrazíte příkazem:

man entr

Manuálová stránka poskytuje detailní informace:


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)

  • Automatické restartování serveru MySQL při změně souboru JavaScript v aktuálním adresáři:
ls *.js | entr -r mysql
  • Automatické restartování webového serveru nebo ukončení v případě jeho pádu:
$ ls * | entr -rz ./httpd

Další informace a příklady použití naleznete v oficiálním GitHub repozitáři.

Závěrem

Doufám, že tento článek vám byl nápomocen při hledání způsobu, jak automaticky spouštět příkazy v Linuxu při změnách souborů.

Mohlo by vás také zajímat, jak odstraňovat soubory a adresáře v Linuxu.