Cum se execută comanda când fișierele se modifică în Linux?

Te afli în locul ideal dacă ești interesat să descoperi metode prin care să execuți comenzi Linux în momentul în care un fișier dintr-un anumit director suferă modificări sau când sunt adăugate fișiere noi.

În sistemul Linux, cron este un instrument util pentru programarea execuției comenzilor la anumite intervale de timp.

Dar ce se întâmplă dacă ai nevoie ca anumite comenzi să fie activate automat de fiecare dată când un fișier este modificat sau când un fișier nou este inclus într-un director?

Ei bine, această acțiune poate fi realizată cu ușurință, folosind anumite instrumente disponibile în linia de comandă.

Să începem explorarea!

watchexec

watchexec este un instrument independent și foarte util, care monitorizează activitatea unui director specific și execută o comandă atunci când detectează modificări, cum ar fi actualizarea fișierelor sau crearea unora noi.

Caracteristici

  • Elimină necesitatea unei linii de comandă complicate, care ar implica xargs (argumente extinse).
  • Monitorizează în timp real schimbările din directorul curent și din toate subdirectoarele.
  • Nu depinde de niciun limbaj de programare specific sau ecosistem, fiind un instrument universal.
  • Utilizează fișierele .gitignore și .ignore în mod implicit pentru a determina ce fișiere să nu monitorizeze.
  • Administrează grupurile de procese pentru a urmări aplicațiile create.
  • Oferă suport pentru monitorizarea fișierelor cu anumite extensii.
  • Este compatibil cu OS X, Linux și Windows.
  • Permite filtrarea și ignorarea evenimentelor bazate pe glob (modele de căutare a fișierelor care permit identificarea numelor de fișiere parțial identice).

Instalarea watchexec

Pentru a instala watchexec, introdu adresa următoare în terminal sau într-un prompt shell și apasă tasta Enter.

Linux și macOS

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

După o instalare reușită, calea de instalare va fi afișată pe ecran. În cazul meu, instrumentul a fost instalat în /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

După instalare, navighează către directorul .local/bin și verifică dacă fișierul este prezent, folosind următoarele comenzi.

cd .local/bin

ls

Următorul pas este să exporți calea pentru a putea utiliza instrumentul watchexec.

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

Pentru a-l activa, introdu simplu comanda watchexec în terminal, ca utilizator root. Pentru a vedea ce opțiuni și parametri pot fi utilizați cu acest instrument, rulează următoarea comandă:

watchexec --help

Exemple de comenzi

  • Rulează comanda `ls -la` de fiecare dată când un fișier este modificat în directorul sau subdirectoarele curente. Această comandă afișează toate fișierele din director la fiecare modificare detectată.
watchexec -- ls -la
  • Execută o comandă specifică atunci când fișierele cu extensiile python, js, CSS sau HTML din directorul curent sunt modificate. Poți specifica orice comandă dorești. Extensiile fișierelor trebuie separate prin virgulă.
 watchexec --exts py,js,css,html <command>
  • Rulează o comandă atunci când un fișier din directoarele lib sau src este modificat. Opțiunea „-w” permite monitorizarea unui fișier sau director specific din sistem.
watchexec -w lib -w src <command>
  • Activează sau repornește un serviciu de fiecare dată când un fișier din directorul curent (sau subdirectoare) este modificat.
watchexec -e html -r tor

watchexec -e js,py -r mysql

Aici, opțiunea „-r” repornește procesul sau serviciul dacă acesta este deja activ în sistem.

Pentru mai multe exemple de utilizare a watchexec, poți consulta depozitul oficial GitHub.

intră

intră este un utilitar simplu și eficient pentru linia de comandă, care permite rularea unor comenzi arbitrare atunci când apar modificări într-un director anume.

„entr” este abrevierea de la Event Notify Test Runner (Executator de teste prin notificare de evenimente). Acest instrument a fost creat pentru a oferi un feedback rapid și pentru a automatiza testarea.

Instalare

entr este de obicei preinstalat în distribuțiile Linux. Dacă nu este prezent, trebuie să-l instalezi manual.

Acest instrument este ușor de utilizat și poate fi instalat prin comanda:

sudo apt-get install entr

Alternativ, îl poți instala clonând depozitul oficial Git.

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

Apoi, navighează la directorul respectiv și instalează cerințele folosind comenzile de mai jos.

./configure
make test
make install

Pentru a vedea opțiunile de construcție disponibile, execută `./configure -h`.

Exemple de comenzi

Pentru a consulta opțiunile și argumentele disponibile pentru comanda `entr`, folosește comanda următoare.

man entr

Această comandă afișează manualul de utilizare pentru comanda `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)
  • Pentru a lansa și reîncărca automat un server MySQL atunci când orice fișier JavaScript este modificat în directorul de lucru. De fiecare dată când modificările sunt salvate în fișier, entr reîncarcă serverul MySQL.
ls *.js | entr -r mysql
  • Pentru a reîncărca automat un server web sau pentru a-l închide dacă serverul se oprește.
$ ls * | entr -rz ./httpd

Pentru mai multe detalii și exemple despre comanda `entr`, poți vizita depozitul lor oficial GitHub.

Concluzie 👩‍💻

Sper că acest articol te-a ajutat să înțelegi cum să execuți comenzi Linux atunci când fișierele dintr-un director specific sunt modificate sau când sunt create fișiere noi.

De asemenea, te-ar putea interesa să afli cum să ștergi fișiere și directoare în Linux.