Jak okresowo uruchamiać program za pomocą polecenia Watch w systemie Linux

Często zachodzi potrzeba wielokrotnego wykonywania tych samych operacji lub programów w celu obserwacji różnych aspektów funkcjonowania systemu, na przykład aktywnych procesów, poziomu zajętości dysku czy aktualnie zalogowanych użytkowników. W systemie Linux, polecenie `watch` umożliwia automatyzację tych zadań, eliminując konieczność ręcznego ich powtarzania.

Za jego pomocą można w czasie rzeczywistym śledzić rozmaite zdarzenia systemowe, jak choćby logowanie użytkowników, stan sieci, obciążenie pamięci i procesora, czy wykorzystanie miejsca na dysku. Spójrzmy, jak praktycznie wykorzystać polecenie `watch` w systemie Linux.

Czym jest polecenie `watch`?

Polecenie `watch` w systemie Linux regularnie uruchamia wskazane polecenie lub program i prezentuje jego wynik w terminalu. Dzięki temu można na bieżąco obserwować zmiany w wyjściu. Przy każdym odświeżeniu, dane wyjściowe są aktualizowane, zastępując poprzedni stan. Domyślnie polecenie jest powtarzane co dwie sekundy i działa, dopóki nie zostanie zatrzymane ręcznie za pomocą kombinacji klawiszy Ctrl + C.

Składnia polecenia `watch`

Ogólna struktura polecenia `watch` przedstawia się następująco:

 watch [opcje] <polecenie> 

Polecenie `watch` obsługuje szereg opcji, które modyfikują jego zachowanie. W podstawowej formie, bez dodatkowych opcji, wskazane polecenie będzie wykonywane co dwie sekundy. Przykładowo, poniższy kod uruchomi polecenie `ls` i wyświetli listę plików w katalogu domowym użytkownika:

 watch ls -l ~/ 

Wyświetlane dane będą na bieżąco aktualizowane, pokazując wszelkie zmiany w zawartości katalogu, takie jak utworzenie, usunięcie, czy modyfikacja rozmiaru plików. Wszystko to będzie odświeżane co dwie sekundy.

Wykonanie polecenia co X sekund za pomocą `watch`

Możliwe jest dostosowanie częstotliwości odświeżania polecenia `watch`. Można określić, aby `watch` odczekał zadaną liczbę sekund przed ponownym wykonaniem polecenia. Aby zmienić ten interwał, należy użyć opcji `-n`, a po niej podać żądaną liczbę sekund.

 watch -n  

Na przykład, aby polecenie było wykonywane co 5 sekund, należy użyć:

 watch -n 5 <polecenie> 

Podkreślenie zmian pomiędzy aktualizacjami

Standardowo, polecenie `watch` nadpisuje wyjście przy każdej aktualizacji. Używając opcji `-d`, możemy dodatkowo podświetlić te fragmenty wyjścia, które uległy zmianie w porównaniu z poprzednim wynikiem.

 watch -d 

Ukrywanie nagłówka w wyjściu polecenia `watch`

Domyślnie `watch` dodaje na początku każdego wyjścia nagłówek zawierający informacje o interwale aktualizacji, nazwie wykonywanego polecenia oraz aktualną datę i godzinę systemową. Nagłówek można usunąć z wyjścia, używając opcji `-t`:

 watch -t <polecenie> 

Sygnalizacja dźwiękowa w przypadku błędu

Po zakończeniu działania, procesy w systemie Linux zwracają kod zakończenia. Standardowo 0 oznacza powodzenie, a wartość różna od zera sygnalizuje wystąpienie błędu. Opcja `-b` polecenia `watch` aktywuje sygnał dźwiękowy, jeśli wykonane polecenie zwróci kod zakończenia różny od zera.

Przykładowo, monitorując usługę `sshd.service`, chcemy być powiadomieni, jeśli usługa zostanie zatrzymana. W tym celu użyjemy:

 watch -b sudo systemctl status sshd.service 

To polecenie wyda dźwięk, gdy usługa przestanie działać. Sygnał ustanie, gdy usługa zostanie ponownie uruchomiona. Aby to przetestować, otwórz drugie okno terminala i zatrzymaj usługę. Powinny pojawić się ciągłe sygnały dźwiękowe aż do ponownego uruchomienia usługi. Należy jednak pamiętać, że do korzystania z tej opcji potrzebny jest zainstalowany w systemie pakiet `beep`.

Zakończenie działania `watch` po zmianie wyjścia

Możliwe jest również ustawienie, aby polecenie `watch` zakończyło działanie, gdy wyjście polecenia ulegnie zmianie. Służy do tego opcja `-g`. Jest to szczególnie przydatne w sytuacjach, gdy oczekujemy na konkretne zmiany w wynikach.

Po wykryciu zmiany w wyjściu, polecenie `watch` automatycznie zakończy swoje działanie. Można połączyć to z poleceniem `echo`, aby wyświetlić stosowny komunikat na ekranie.

Rozważmy przykład, gdzie czekamy na pojawienie się pliku w określonym katalogu. Poniższe polecenie będzie monitorować katalog i zakończy działanie, gdy tylko wskazany plik się pojawi, wyświetlając o tym stosowną informację.

 watch -g "ls -l | grep nazwa_pliku" && echo "Plik przybył" 

Inny przydatny przykład to powiadomienie o zalogowaniu się konkretnego użytkownika do systemu:

 watch -g "who | grep nazwa_użytkownika" && echo "Użytkownik zalogowany" 

To polecenie będzie monitorować wyjście polecenia `who`, które wyświetla listę zalogowanych użytkowników. Gdy dany użytkownik się zaloguje, polecenie `watch` zostanie zakończone i wyświetli komunikat w terminalu.

Podobnie, można wykorzystać `watch` do zatrzymania usługi, gdy w pliku pojawią się określone zmiany. Należy pamiętać, że w przypadku łączenia poleceń za pomocą potoku, całe polecenie należy umieścić w cudzysłowie.

Monitorowanie aktywności w systemie Linux za pomocą `watch`

Jeśli regularnie powtarzasz te same czynności, rozważ wykorzystanie polecenia `watch` do ich zautomatyzowania. Pozwoli to uniknąć ciągłego wpisywania tych samych poleceń, aby sprawdzać, co się zmieniło.

Polecenie `watch` można stosować w połączeniu z innymi poleceniami systemu Linux, aby monitorować zasoby i aktywność systemową, oraz śledzić zmiany w plikach i katalogach.