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.