Hur man kör kommandot när filen ändras i Linux?

By rik

Om du vill lära dig hur du kan automatisera processer baserat på filändringar i en Linux-miljö, har du kommit till rätt ställe. Den här artikeln utforskar hur du triggar kommandon när filer ändras eller skapas i en specifik katalog.

I Linux är det vanligt att använda cron för att schemalägga uppgifter vid specifika tidpunkter. Men det finns situationer där du behöver reagera omedelbart på förändringar i filsystemet.

Detta kan åstadkommas med hjälp av specialiserade kommandoradsverktyg, som vi kommer att undersöka närmare.

Låt oss börja med att utforska dessa verktyg!

watchexec

watchexec är ett fristående verktyg som övervakar en viss arbetskatalog. Det aktiverar ett kommando automatiskt när det upptäcker filändringar eller nyskapade filer.

Funktioner

  • Undviker komplexa kommandorader som involverar xargs.
  • Övervakar ändringar i realtid, både i den aktuella katalogen och dess underkataloger.
  • Är inte beroende av någon specifik språkmiljö, vilket gör det flexibelt.
  • Använder .gitignore och .ignore filer för att filtrera bort irrelevanta filer.
  • Hantera förgrenade processer effektivt med hjälp av processgrupper.
  • Stöder övervakning av filer med specifika filändelser.
  • Fungerar på OS X, Linux och Windows.
  • Tillåter filtrering och ignorering av händelser baserat på globmönster.

Installation av watchexec

För att installera watchexec, använd följande kommando i terminalen:

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

Efter en lyckad installation kommer installationssökvägen att visas. Till exempel kan verktyget installeras i `/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

Navigera sedan till katalogen `.local/bin` och verifiera att filen finns där:

cd .local/bin

ls

För att kunna använda watchexec, behöver du exportera sökvägen:

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

För att visa hjälpen för watchexec, kör kommandot:

watchexec --help

Exempel på kommandon

  • Kör `ls -la` när en fil ändras i katalogen eller dess underkataloger:

    watchexec -- ls -la
  • Kör ett valfritt kommando när en fil med ändelsen `.py`, `.js`, `.css` eller `.html` ändras i den aktuella katalogen (eller underkataloger):

    watchexec --exts py,js,css,html <command>
  • Övervaka ändringar i katalogerna `lib` och `src`:

    watchexec -w lib -w src <command>
  • Starta om en tjänst när en fil i katalogen ändras. Exempelvis en webbserver (tor):

    watchexec -e html -r tor

    Eller en databasserver (mysql):

    watchexec -e js,py -r mysql

    Här startar `-r` om den angivna tjänsten.

För ytterligare exempel, besök watchexec’s officiella GitHub-förråd.

entr

entr är ett kommandoradsverktyg som utför anpassade kommandon när filändringar sker.

Namnet ”entr” står för Event Notify Test Runner, och verktyget skapades för att underlätta snabb feedback och automatiserad testning.

Installation

I många Linux-distributioner är entr förinstallerat. Om det inte är det, installera det med:

sudo apt-get install entr

Alternativt kan du klona Git-förrådet och installera manuellt:

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

Navigera sedan till den klonade katalogen och kör följande kommandon:

./configure
make test
make install

Se tillgängliga konfigurationsalternativ med:

./configure -h

Exempel på kommandon

För att se de tillgängliga alternativen för `entr`-kommandot, använd:

man entr

Detta visar manualen för `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)
  • Starta om en MySQL-server när en JavaScript-fil ändras i arbetskatalogen:

    ls *.js | entr -r mysql
  • Starta om en webbserver automatiskt eller avsluta om servern stängs ner:

    $ ls * | entr -rz ./httpd

Mer information finns i det officiella GitHub-förrådet.

Slutord 👩‍💻

Förhoppningsvis har denna artikel givit dig en bra inblick i hur du kan automatisera kommandon i Linux baserat på filändringar. Genom att använda verktyg som watchexec och entr, kan du effektivisera ditt arbetsflöde och göra din utvecklingsprocess mer effektiv.

Om du vill lära dig mer om Linux, kan du även läsa om hur du tar bort filer och kataloger i Linux.