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.