Jeśli poszukujesz sposobu na automatyczne wykonywanie poleceń w systemie Linux w odpowiedzi na modyfikacje plików lub tworzenie nowych, to trafiłeś idealnie.
Harmonogram zadań cron umożliwia uruchamianie poleceń o określonych porach.
Jednakże, gdy potrzebujesz, by polecenia reagowały na zmiany w plikach – ich edycję lub pojawienie się nowych – konieczne są inne rozwiązania.
Na szczęście istnieje kilka narzędzi wiersza poleceń, które potrafią to zrobić z łatwością.
Zacznijmy eksplorować te możliwości!
watchexec
watchexec to kompaktowe narzędzie, które śledzi zmiany w zadanym folderze i, w przypadku wykrycia modyfikacji (aktualizacji pliku, dodania nowego pliku), wykonuje określone polecenie.
Funkcje
- Nie wymaga skomplikowanych instrukcji z użyciem xargs.
- Monitoruje zmiany w czasie rzeczywistym w danym katalogu i jego podfolderach.
- Jest niezależny od języka programowania, nie jest związany z żadnym konkretnym ekosystemem.
- Domyślnie wykorzystuje pliki .gitignore i .ignore, aby decydować, które zmiany mają być ignorowane.
- Używa grup procesów do zarządzania programami, które tworzą procesy potomne.
- Umożliwia monitorowanie tylko plików o określonych rozszerzeniach.
- Działa na systemach OS X, Linux i Windows.
- Pozwala na filtrowanie i ignorowanie zdarzeń za pomocą glob (wzorców do wyszukiwania plików).
Instalacja watchexec
Aby zainstalować watchexec, wklej poniższe polecenie w terminalu i zatwierdź klawiszem Enter.
Linux i macOS
curl -sS https://webinstall.dev/watchexec | bash
Po udanej instalacji na ekranie pojawi się ścieżka, gdzie program został umieszczony. W moim przypadku narzędzie to zostało zainstalowane w /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
Po instalacji przejdź do katalogu .local/bin i za pomocą poniższych poleceń sprawdź, czy plik się w nim znajduje.
cd .local/bin ls
Następnym krokiem jest dodanie ścieżki do zmiennej środowiskowej PATH, aby móc używać narzędzia watchexec z dowolnego miejsca.
export PATH="/root/.local/bin:$PATH"
Aby uruchomić watchexec jako root, wpisz po prostu 'watchexec’ w terminalu. Użyj tego polecenia, aby sprawdzić, jakie opcje i flagi są dostępne:
watchexec --help
Przykładowe komendy
- Wywołanie `ls -la` przy każdej zmianie pliku w katalogu lub jego podfolderach. To polecenie pokazuje zawartość katalogu po wykryciu jakiejkolwiek modyfikacji.
watchexec -- ls -la
- Uruchomienie komendy za każdym razem, gdy zmienia się plik z rozszerzeniem py, js, css lub html w bieżącym katalogu. Możesz tu podać dowolne polecenie. Rozszerzenia plików należy oddzielać przecinkami.
watchexec --exts py,js,css,html <polecenie>
- Wykonanie polecenia, gdy zmieni się jakikolwiek plik w katalogach lib lub src. Opcja „-w” pozwala na monitorowanie określonego pliku lub katalogu.
watchexec -w lib -w src <polecenie>
- Wywołanie lub restart usługi po modyfikacji dowolnego pliku w bieżącym katalogu (i podkatalogach).
watchexec -e html -r tor watchexec -e js,py -r mysql
Opcja „-r” restartuje proces lub usługę, jeśli aktualnie działają.
Więcej przykładów użycia watchexec można znaleźć w oficjalnym repozytorium na GitHubie.
entr
entr to prosty i skuteczny program, służący do uruchamiania określonych poleceń w odpowiedzi na zmiany w plikach danego katalogu.
Nazwa „entr” to skrót od „event notify test runner”. Został stworzony w celu przyspieszenia uzyskiwania informacji zwrotnej i automatyzacji testów.
Instalacja
entr jest często preinstalowany w dystrybucjach Linuksa. Jeśli nie, zainstaluj go ręcznie.
Instalacja jest prosta, wystarczy użyć poniższego polecenia.
sudo apt-get install entr
Możesz również zainstalować go, klonując oficjalne repozytorium Git.
git clone https://github.com/eradman/entr.git
Następnie wejdź do sklonowanego katalogu i zainstaluj zależności za pomocą poniższych poleceń.
./configure make test make install
Aby wyświetlić dostępne opcje kompilacji, uruchom `./configure -h`
Przykładowe komendy
Aby zobaczyć opcje i argumenty dostępne dla polecenia entr, użyj następującego polecenia.
man entr
To polecenie wyświetli podręcznik użytkownika (manual) dla polecenia 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)
- Automatyczne ponowne ładowanie serwera MySQL po zmianie dowolnego pliku JavaScript w katalogu roboczym. Przy każdej zmianie pliku entr przeładuje serwer MySQL.
ls *.js | entr -r mysql
- Automatyczne przeładowanie serwera HTTP lub zakończenie, jeśli serwer zostanie zamknięty.
$ ls * | entr -rz ./httpd
Więcej informacji i przykładów użycia polecenia entr można znaleźć w oficjalnym repozytorium GitHub.
Podsumowanie 👩💻
Mam nadzieję, że ten artykuł pomógł ci w zrozumieniu, jak automatycznie uruchamiać polecenia w systemie Linux po modyfikacji lub dodaniu plików w danym katalogu.
Być może zainteresuje cię także temat usuwania plików i katalogów w systemie Linux.