Jak poprawnie używać polecenia watch w Linux
Dowiedz się, jak efektywnie stosować polecenie watch. Wyjaśniamy dobór interwału, flagę --differences, parametr --chgexit oraz poprawne cytowanie potoków w systemach Linux.
Działanie polecenia watch
Polecenie watch uruchamia ponownie inne polecenie w określonym odstępie czasu i odświeża jego wynik w tym samym miejscu na ekranie. Domyślny interwał wynosi dwie sekundy. Należy z niego korzystać w sytuacjach, gdy oczekuje się na zmianę wartości: zapełnianie się dysku, stabilizację kontenera, zakończenie odnawiania certyfikatu lub opróżnianie kolejki.
watch pochodzi z pakietu procps-ng i jest domyślnie zainstalowane na świeżym VPS z systemem Ubuntu lub Debian jako część pakietu procps. Przed użyciem poniższych flag należy sprawdzić wersję narzędzia, ponieważ dwie z przydatnych opcji zostały dodane niedawno.
watch --versionW systemie Ubuntu 24.04 polecenie to wyświetla linię podobną do watch from procps-ng 4.0.4. Oto najprostszy praktyczny przykład.
watch df -h /Ekran zostaje wyczyszczony i wyświetla linię nagłówka, pustą linię, a następnie wynik polecenia df -h /:
Every 2.0s: df -h / server1: Sun Aug 9 10:21:44 2026Po lewej stronie znajduje się interwał oraz dokładne polecenie wykonywane przez watch. Po prawej stronie widnieje nazwa hosta i bieżący czas. Zegar jest użyteczną częścią interfejsu, ponieważ potwierdza, że ekran jest odświeżany, nawet jeśli liczby poniżej pozostają niezmienione. Aby zakończyć, należy nacisnąć Ctrl+C.
Narzędzie watch rysuje jedną ramkę dopasowaną do rozmiaru terminala. Długie linie są zawijane, chyba że użyto flagi -w, która je ucina; treść wykraczająca poza dolną krawędź nie jest wyświetlana. Wewnątrz ramki nie ma możliwości przewijania, ponieważ każdy cykl nadpisuje poprzedni. Ten fakt determinuje większość zastosowań polecenia watch.
Jak często polecenie watch powinno uruchamiać komendę?
Dwie sekundy to tylko wartość domyślna. Interwał należy dobrać w zależności od szybkości zmian wartości oraz kosztu pojedynczego uruchomienia.
-n 0.5dla liczników zmieniających się w sposób ciągły, takich jakss -slub liczba bajtów na interfejsie. Najmniejszy interwał akceptowany przez watch to 0,1 sekundy.-n 30lub-n 60dla dysków i certyfikatów. System plików zapełniający się w ciągu doby nie wymaga trzydziestu odświeżeń na minutę.
Polecenie watch uruchamia komendę, czeka na jej zakończenie, a dopiero potem przechodzi w stan uśpienia na czas interwału. Czas wykonania jest doliczany do przerwy, więc komenda trwająca osiem sekund przy -n 2 zapewnia odświeżenie co dziesięć sekund i stale obciąża maszynę. Dodaj -p (--precise), aby watch dążył do uruchamiania komendy co interwał sekund, licząc od początku jednego uruchomienia do początku następnego.
Jeśli wymagana jest inna wartość domyślna, należy wyeksportować WATCH_INTERVAL w profilu powłoki. Jawnie podane -n nadal ma pierwszeństwo. Uruchom watch --help, aby potwierdzić, że używana wersja odczytuje tę zmienną.
Wyróżnianie zmian za pomocą -d
Analiza bloku identycznego tekstu w celu znalezienia jednego zmienionego pola jest nieefektywna. -d (--differences) wykonuje to zadanie automatycznie.
watch -n 30 -d 'df -h / /var'Znaki różniące się od poprzedniej ramki są wyświetlane w trybie negatywu, dzięki czemu komórka Use% podświetla się w momencie zmiany, podczas gdy reszta pozostaje statyczna. Jeśli /var nie jest oddzielnym systemem plików, system plików root zostanie wyświetlony dwukrotnie, co pozwala szybko zidentyfikować sposób partycjonowania serwera.
Porównanie odbywa się na podstawie pozycji, co oznacza, że watch --differences=permanent zestawia nową ramkę ze starą znak po znaku. Dane wyjściowe, których kolumny zmieniają szerokość, zostaną podświetlone niemal w całości, dlatego należy wybierać polecenia o stabilnym układzie. Aktualne wersje procps-ng obsługują również flagę watch --differences=permanent, która utrzymuje podświetlenie każdej pozycji, która kiedykolwiek uległa zmianie, zamiast wskazywać tylko ostatnią modyfikację. Należy zweryfikować to działanie za pomocą watch --help przed poleganiem na tej funkcji.
Jak sprawić, aby watch zakończył działanie po zmianie wyjścia?
-g (--chgexit) zatrzymuje watch przy pierwszej różnicy w wyjściu względem poprzedniego uruchomienia. Powraca znak zachęty, więc można umieścić kolejne polecenie w tej samej linii.
watch -n 10 -g 'systemctl is-active myapp' ; echo 'state changed'Jest to flaga, która zmienia watch w narzędzie typu „powiadom mnie, gdy wdrożenie się zakończy”. Zawiera jedną pułapkę, w którą wpadają wszyscy: porównanie obejmuje całe wyjście, więc każdy zegar lub PID (identyfikator procesu) zmienia się już przy pierwszym odświeżeniu, co powoduje natychmiastowe zakończenie działania watch. systemctl status myapp wypisuje czas wykonania oraz użycie pamięci, więc użycie -g w tym przypadku jest bezużyteczne. Należy ograniczyć polecenie do pojedynczego, stabilnego faktu, na który oczekujemy, co zapewnia systemctl is-active.
Nowsze wersje procps-ng dodają test odwrotny, --equexit <cycles>, który kończy działanie, gdy wyjście pozostaje niezmienione przez określoną liczbę cykli. Odpowiada to na pytanie „powiadom mnie, gdy sytuacja się uspokoi”. Należy sprawdzić watch --help, ponieważ starsze kompilacje nie posiadają tej funkcji.
Dlaczego watch ignoruje potok i glob?
Jest to błąd, na który trafia każdy użytkownik, a jego przyczyna leży w powłoce, a nie w samym narzędziu watch.
watch docker compose ps | grep webInteraktywna powłoka odczytuje cały wiersz przed uruchomieniem czegokolwiek i dzieli go w miejscu wystąpienia potoku. Uruchamia ona watch docker compose ps i łączy wyjście ekranowe samego narzędzia watch z grep. Narzędzie watch przestaje zapisywać dane do terminala, więc wyświetlany obraz jest uszkodzony lub pusty, a grep filtruje odświeżanie wyjścia zamiast listy kontenerów.
Należy ująć cały potok w cudzysłów, aby został przekazany jako jeden argument.
watch 'docker compose ps | grep web'Narzędzie watch przekazuje ten ciąg znaków do sh -c, a powłoka wykonuje potok w każdym cyklu. Wzorce glob podlegają tej samej zasadzie, choć objawy są mniej widoczne.
watch ls -l /var/log/*.log
watch 'ls -l /var/log/*.log'Pierwszy wiersz rozwija wzorzec glob tylko raz, w powłoce, w momencie naciśnięcia klawisza Enter. Następnie watch uruchamia ponownie zamrożoną listę nazw plików, więc plik dziennika utworzony minutę później nigdy się nie pojawi. Drugi wiersz przekazuje wzorzec glob do narzędzia watch, które rozwija go wewnątrz sh w każdym cyklu, dzięki czemu nowe pliki pojawiają się automatycznie.
Cudzysłowy decydują również o tym, kiedy zmienna lub podstawienie polecenia zostaną obliczone. watch "echo $(date)" uruchamia date raz, w powłoce, a następnie w nieskończoność wyświetla ten sam ciąg znaków. watch 'echo $(date)' uruchamia date w każdym cyklu. Pojedynczy cudzysłów oznacza wykonanie później. Podwójny cudzysłów oznacza wykonanie teraz.
Dwa kolejne skutki użycia sh -c:
- Aliasy i funkcje powłoki nie istnieją wewnątrz tego środowiska.
watch llkończy się niepowodzeniem zsh: 1: ll: not found, ponieważsh -cnigdy nie odczytuje pliku.bashrc. Należy wpisać pełne polecenie lub podać pełną ścieżkę do pliku binarnego, który znajduje się tylko w interaktywnej powłocePATH. - Warto przechwytywać standardowe wyjście błędów. Należy umieścić
2>&1wewnątrz cudzysłowu, jeśli tekst błędu ma być wyświetlany w ramce, a nie rozproszony po ekranie.
Gdy używanie cudzysłowów staje się uciążliwe, -x (--exec) uruchamia polecenie bezpośrednio, z pominięciem sh -c. Argumenty ze spacjami stają się łatwiejsze w obsłudze, jednak potoki i wzorce glob przestają działać całkowicie, ponieważ nie ma powłoki, która mogłaby je zinterpretować.
Uprawnienia podlegają tej samej logice, ponieważ watch jest zwykłym procesem. watch 'sudo ss -tulpn' wywołuje monit o hasło, którego nie można zobaczyć ani wpisać. Zamiast tego należy uruchomić sudo watch 'ss -tulpn' i pamiętać, że cała pętla działa z uprawnieniami root do momentu naciśnięcia Ctrl+C.
Cztery rzeczy warte monitorowania na VPS
Dysk, który się zapełnia
watch -n 30 -d 'df -h / /var'df pobiera z jądra dane, które są już w pamięci, więc jest to operacja tania i można ją powtarzać w nieskończoność. du -sh /var/log działa inaczej, ponieważ przy każdym wywołaniu przeszukuje każdy plik w drzewie katalogów. Użycie go z watch powoduje ciągły odczyt dysku i spowalnia maszynę, którą próbujesz zdiagnozować. Uruchom du jednorazowo lub użyj ncdu, a następnie pozostaw df pod nadzorem watch, aby sprawdzić, czy wartość nadal rośnie.
Kontener, który ciągle się restartuje
cd /srv/myapp
watch -n 5 -d 'docker compose ps'Kolumna status pokazuje, jak długo działa każdy kontener. Kontener w pętli awarii ciągle resetuje się do stanu "Up 2 seconds", a -d sprawia, że widać to na pierwszy rzut oka. Najpierw zmień katalog, ponieważ watch dziedziczy katalog roboczy powłoki, z której został uruchomiony, a docker compose wymaga dostępu do katalogu projektu. watch informuje o wystąpieniu restartu. docker compose logs -f web wyjaśnia przyczynę. Gdy poznasz powód, zakoduj rozwiązanie jako healthcheck w Compose, który automatycznie restartuje kontener, aby nikt nie musiał śledzić tego ręcznie na ekranie.
Odnowienie certyfikatu
sudo -i
watch -n 60 -g 'openssl x509 -noout -enddate -in /etc/letsencrypt/live/example.com/fullchain.pem'Polecenie wypisuje tylko jedną linię, notAfter=Nov 7 09:14:22 2026 GMT, więc -g zadziała dokładnie w momencie, gdy plik zostanie zastąpiony nowym. Pliki w /etc/letsencrypt/live są czytelne tylko dla root, dlatego polecenie to musi być uruchomione w powłoce z uprawnieniami roota. Pamiętaj, że monitorowany jest certyfikat na dysku. Działający serwer WWW przechowuje stary certyfikat w pamięci do momentu przeładowania, więc sprawdź, co faktycznie jest serwowane za pomocą echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate. Nie ustawiaj tego polecenia z dwusekundowym interwałem dla publicznego hosta. Samo odnawianie powinno być obsługiwane przez usługę i timer systemd, a systemctl list-timers pokazuje, kiedy nastąpi kolejne uruchomienie.
Opróżnianie kolejki
watch -n 15 'postqueue -p | tail -n 1'To polecenie wypisuje linię podsumowania, taką jak -- 24 Kbytes in 6 Requests., lub Mail queue is empty po zakończeniu pracy. Ten sam schemat działa dla każdej kolejki, którą można policzyć: watch -n 5 'find /srv/queue/incoming -type f | wc -l'.
W tym miejscu watch osiąga swoje ograniczenia. Porównuje on jedną klatkę z poprzednią i nie potrafi testować warunków, więc nie powiadomi Cię, gdy "licznik osiągnie zero". Zwykła pętla powłoki może to zrobić, wykorzystując podstawianie poleceń do przechwytywania wartości licznika w każdym przebiegu:
until [ "$(find /srv/queue/incoming -type f | wc -l)" -eq 0 ]; do sleep 5; done; echo 'queue drained'Kiedy polecenie watch jest niewłaściwym narzędziem
Polecenie watch uruchamia ponownie wskazany proces, nie przechowując informacji o poprzednim wykonaniu i nie analizując charakteru działania tego procesu. Jest to akceptowalne w przypadku df. Istnieją jednak cztery sytuacje, w których takie podejście jest błędne.
- Dzienniki. Polecenie watch odświeża stały obszar ekranu, przez co wiersze pojawiające się i znikające między cyklami odświeżania są tracone. Należy użyć
journalctl -fu nginxlubtail -f, które przesyłają strumieniowo nowe wiersze w momencie ich zapisu. - Kosztowne operacje.
du -sh /lub zapytanie do obciążonej bazy danych staje się stałym obciążeniem w tle przy dowolnym interwale, ponieważ watch nieustannie inicjuje je od nowa. - Operacje z efektami ubocznymi. Polecenie, które zapisuje dane, wysyła żądania, restartuje usługi lub instaluje pakiety, będzie powtarzać te czynności w każdym cyklu. Wykonywanie
curlwzględem API co dwie sekundy generuje 43 200 żądań dziennie, co prowadzi do zawieszenia darmowego klucza API. - Długotrwałe monitorowanie. Polecenie watch działa wewnątrz terminala i kończy pracę wraz z sesją. Nie powiadamia nikogo i nie przechowuje historii po zamknięciu laptopa. W takich przypadkach należy użyć profesjonalnego monitora statusu, takiego jak Uptime Kuma lub zaplanowanego zadania działającego na serwerze.
Granicę wyznacza czas. Polecenie watch służy do dziesięciominutowego oczekiwania na konkretne zdarzenie. Wszystko, co powinno być sprawdzane również następnego dnia, wymaga zaplanowanego timera lub dedykowanego systemu monitoringu.
Uruchamianie watch wewnątrz tmux podczas sesji SSH
W przypadku połączenia SSH trwałość polecenia watch jest ograniczona stabilnością połączenia. Gdy połączenie zostanie zerwane, powłoka otrzymuje sygnał SIGHUP, co powoduje zakończenie działania watch. Narzędzie tmux rozwiązuje ten problem, czyniąc watch w pełni użytecznym na zdalnych serwerach.
tmux new -As ops
watch -n 30 -d 'df -h /'Naciśnij Ctrl+b, a następnie d, aby odłączyć sesję. Pętla nadal działa na serwerze. Po ponownym połączeniu za pomocą tmux attach -t ops ramka będzie nadal aktualizowana, co potwierdza zegar w nagłówku. Podziel okno, aby zachować watch po jednej stronie i journalctl -f po drugiej; jest to podstawowa koncepcja środowiska pracy w terminalu opartego na tmux. Gdy to samo pytanie dotyczy kilku serwerów jednocześnie, zadanie to należy powierzyć narzędziu przeznaczonemu do zarządzania wieloma serwerami Linux, zamiast tworzyć zestaw wielu paneli watch.
Przedstawione tutaj zrzuty ekranu mają charakter poglądowy. Układ kolumn oraz ciągi wersji mogą się różnić w zależności od dystrybucji i wydań procps-ng, dlatego należy zapoznać się z man watch na własnej maszynie, aby sprawdzić flagi dostępne w używanej wersji.
FAQ
Dlaczego watch ignoruje potok w watch mycmd | grep foo?
Powłoka dzieli linię w miejscu potoku, zanim watch zostanie uruchomiony. W efekcie potok przekierowuje wyjście rysowania ekranu programu watch do grep, a wyjście polecenia nie jest filtrowane. Należy ująć cały potok w cudzysłów: watch 'mycmd | grep foo'. Program watch przekazuje ten pojedynczy argument do sh -c, który wykonuje potok raz w każdym cyklu. Ta sama zasada dotyczy znaków wieloznacznych (glob) oraz podstawiania poleceń.
Jaki interwał należy stosować w programie watch?
Należy go dostosować do szybkości zmian wartości oraz kosztu wykonania polecenia. Pół sekundy jest odpowiednie dla szybkich liczników, a 0.1 sekundy to najmniejszy interwał akceptowany przez watch. Od trzydziestu do sześćdziesięciu sekund jest odpowiednie dla dysków i certyfikatów. Czas wykonania polecenia jest dodawany do przerwy, chyba że użyto flagi -p. Wtedy wolne polecenie z flagą -n 1 jest wykonywane w sposób ciągły, bez pauz.
Czy watch może śledzić plik dziennika?
Nie. watch odświeża pojedynczą klatkę i nie przechowuje historii, więc każda linia, która pojawi się i zniknie między dwoma cyklami, zostaje utracona. journalctl -fu <unit> oraz tail -f przesyłają nowe linie w momencie ich pojawienia się, co jest wymagane w przypadku dzienników. Program watch należy stosować do wartości posiadających stan bieżący, takich jak procentowe zajęcie dysku czy długość kolejki.
Jak zatrzymać watch, gdy wystąpi oczekiwane zdarzenie?
Należy użyć -g (--chgexit) i podać polecenie, którego wyjście pozostaje niezmienione do momentu wystąpienia zdarzenia. Wyjście zawierające zegar lub PID zmienia się przy pierwszym odświeżeniu i powoduje natychmiastowe wyjście, dlatego systemctl is-active myapp działa tam, gdzie systemctl status myapp nie działa. W przypadku rzeczywistego warunku, takiego jak osiągnięcie zera przez licznik, należy użyć pętli until powłoki, ponieważ watch potrafi wykryć jedynie zmianę wyjścia.
Dlaczego watch zgłasza błąd command not found dla polecenia, które działa w powłoce?
Program watch przekazuje polecenie do sh -c, a ta powłoka nie odczytuje pliku .bashrc, więc zdefiniowane aliasy i funkcje powłoki nie są tam dostępne. Komunikat błędu to zazwyczaj sh: 1: ll: not found. Należy wpisać pełne polecenie lub użyć pełnej ścieżki do pliku binarnego, który znajduje się tylko w interaktywnej powłoce PATH.