Terug naar hoofdinhoud

Linux commando: watch

23 augustus 2026

Je zit ergens op te wachten. Een bestand dat klaar moet zijn met kopieren, een wachtrij die leeg moet lopen, een certificaat dat vernieuwd wordt, een container die op moet komen. Dus druk je op pijltje omhoog en op enter, en dan nog eens, en nog eens. Er bestaat een commando dat dat voor je doet, het zit al dertig jaar in elke Linux-installatie, en bijna iedereen die het gebruikt kent er precies een optie van. watch betaalt ongeveer tien minuten aandacht terug met een tool waar je wekelijks naar grijpt.

1. De basis

watch draait een commando keer op keer en laat je de uitvoer zien op een leeggemaakt scherm. Meer doet het niet. Alles wat interessant is komt voort uit de details van hoe het dat commando draait, en uit het feit dat het niet de tool is die de meeste mensen erin zien.

1.1 De eenvoudigst mogelijke toepassing

Zet watch voor een willekeurig commando:

$ watch date

Het scherm wordt leeggemaakt en vult zich met twee dingen, een kopregel en de uitvoer:

Every 2.0s: date                              xps: Sun Aug 23 21:13:02 2026

Sun Aug 23 09:13:02 PM CEST 2026

Elke twee seconden draait het commando opnieuw en wordt het scherm hertekend. Ctrl-C stopt het. Er is geen andere uitgang, wat mensen verrast die verwachten dat q werkt: watch is geen pager.

1.2 De kopregel lezen

De kopregel bevat vier stukjes informatie en die zijn het kennen waard, want twee ervan beantwoorden precies de vragen die je stelt terwijl je naar het scherm staart.

OnderdeelBetekenis
Every 2.0s Het interval. Bevestigt dat -n begrepen is, wat meer uitmaakt dan je zou denken.
date Het commando zoals watch het ontving, nadat je shell ermee klaar was. Paragraaf 5.1 gaat daar helemaal over.
xps De hostnaam. Handig als er drie terminals openstaan op drie servers.
Sun Aug 23 21:13:02 2026 Wanneer deze verversing plaatsvond. Als hij niet meer oploopt, hangt het commando.

Dat laatste punt is het onthouden waard. Een bevroren klok in de kopregel betekent dat je commando niet terugkomt, niet dat watch is doodgegaan.

1.3 Het interval is een pauze, geen schema

Vrijwel iedereen leest -n 5 als "draai dit elke vijf seconden". Dat betekent het niet. Het betekent "wacht vijf seconden nadat het commando klaar is, en draai het dan opnieuw". Is het commando traag, dan is de cyclus trager dan je vroeg.

Hier een commando dat twee seconden duurt, met het interval op een halve seconde, dat het moment van elke start wegschrijft:

$ watch -n 0.5 'date +%s.%N >> t.log; sleep 2'

# gaps between runs, in seconds:
2.5   2.5   2.5

Niet 0,5. Niet 2,0. Het interval plus de looptijd, elke keer. Daarom loopt een watch op iets traags, een databasequery, een du over een grote boom, een commando dat een DNS-lookup doet, gestaag weg van het ritme dat je dacht in te stellen. Paragraaf 6.3 laat de optie zien die dat oplost, en paragraaf 7.1 het geval waarin zelfs die niet helpt.

Het juiste mentale model: watch is een lus die tussen runs slaapt, geen planner die op intervallen afgaat. Elke eigenaardigheid in dit artikel volgt uit die zin en uit de shell in paragraaf 5.1.

Naar boven

2. Waar komt de naam vandaan?

Voor een keer is er geen etymologische puzzel. Het heet watch omdat je ernaar kijkt. Geen afkorting, geen weggelaten klinker, geen beperking van een teletype uit de jaren zeventig.

De interessante vraag is de omgekeerde: wat de naam mensen laat verwachten. "Watch" betekent in de meeste moderne tooling let op wijzigingen en reageer, zoals webpack --watch of cargo watch of een testrunner in watch-modus. Die tools liggen stil tot een bestand verandert, en doen dan iets.

De Linux-watch doet dat niet. Hij weet niet eens wat een bestand is. Hij draait een commando op een timer en tekent het resultaat, en als er niets veranderd is tekent hij hetzelfde nog een keer. Het verschil is belangrijk genoeg dat paragraaf 7.4 over de tools gaat die het andere werk doen, want naar watch grijpen terwijl je entr wilde is een echt veelgemaakte fout.

Nog twee namen om helder te hebben, want foutmeldingen en pakketzoekopdrachten gebruiken ze:

procps      the original package of /proc tools: ps, top, free, uptime, watch
procps-ng   the "next generation" fork from 2011, which is what you now run
watch(1)    the manual page; note the 1, because there is no watch(8)

Zoek je op internet naar "watch command", dan vind je ook de shell-builtin wait, het systemd-begrip path unit, en een Bash-patroon met while true; do ... sleep; done. Paragraaf 9.1 vergelijkt dat laatste rechtstreeks, want dat is wat watch daadwerkelijk vervangt.

Naar boven

3. Een korte geschiedenis

watch is ouder dan de meeste tools waarmee mensen het vergelijken, en het is meer dan eens herschreven. Het copyrightbestand op elke Debian- of Ubuntu-machine draagt nog steeds de oorspronkelijke naam:

$ grep -A3 "Tony Rems" /usr/share/doc/procps/copyright
Copyright: 1998-2004 Albert Cahalan
           1991 Tony Rems <Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken.>
           1993 Larry Greenfield
           1996 Charles Blake
TijdvakMijlpaal
1991 Tony Rems schrijft de oorspronkelijke watch, met latere correcties van Francois Pinard.
1999 Mike Coleman werkt hem om en voegt de meeste opties toe die mensen vandaag gebruiken, waaronder -d.
2008 Morty Abzug voegt --beep, --exec en de foutafhandeling achter --errexit toe.
2011 De procps-ng-fork neemt het onderhoud over nadat het oorspronkelijke procps stilvalt. Elke gangbare distributie volgt.
2022 procps-ng 4.0.0 voegt --equexit toe: stoppen wanneer de uitvoer niet meer verandert, het spiegelbeeld van --chgexit.
2023 procps-ng 4.0.4 zet kleurinterpretatie standaard aan, en voegt -C toe om het uit te zetten. Paragraaf 7.6 legt uit waarom dat sommige oude commando's brak.

Uit die tijdlijn volgen twee dingen die in de praktijk uitmaken.

Ten eerste zit watch niet in POSIX, en heeft er nooit in gezeten. Het is een Linux-gemak uit de procps-familie, dus het is niet gegarandeerd op een BSD, op macOS (waar je het via Homebrew installeert), of in een minimale container-image. Een script dat erop leunt is een script dat ergens gaat falen, en paragraaf 6.4 behandelt wat je in plaats daarvan schrijft.

Ten tweede zijn de opties niet overal gelijk. De nieuwste (-q, -r, -w) ontbreken op oudere servers, dus controleer voordat je erop vertrouwt:

$ watch --version
watch from procps-ng 4.0.4
Naar boven

4. Eenvoudige toepassingen

4.1 Het interval instellen

-n (afkorting van interval, ondanks de letter) neemt seconden, en accepteert breuken:

$ watch -n 5 systemctl status nginx      # every 5 seconds
$ watch -n 0.5 ls -l /var/spool/mail     # twice a second
$ watch -n 60 df -h                      # once a minute

Er zit een ondergrens op 0,1 seconde, en watch waarschuwt niet als hij afkapt. Hij gebruikt stilletjes het minimum, wat je in de kopregel ziet:

$ watch -n 0.01 true
Every 0.1s: true                              xps: Sun Aug 23 21:16:24 2026

Twee kleinere details die je een verbaasde minuut besparen. Een komma werkt net zo goed als een punt, ten behoeve van Europese locales:

$ watch -n 0,5 true
Every 0.5s: true                              xps: Sun Aug 23 21:16:24 2026

En wil je altijd een andere standaard, stel die dan een keer in je shellprofiel in in plaats van eeuwig -n te typen:

$ export WATCH_INTERVAL=5
$ watch true
Every 5.0s: true                              xps: Sun Aug 23 21:16:25 2026

Onzin wordt geweigerd in plaats van genegeerd, en dat is het gedrag dat je wilt:

$ watch -n abc true
watch: failed to parse argument: 'abc': Invalid argument

4.2 Markeren wat er veranderde

-d (afkorting van differences) is de optie die van watch een verversend scherm maakt dat je ook echt kunt lezen. Hij toont veranderde tekens in inverse video, zodat je oog meteen naar het getal gaat dat bewoog:

$ watch -d free -h
$ watch -d 'ls -l /var/log/nginx'
$ watch -d -n 1 'ss -tn state established | wc -l'

Standaard toont de markering wat er sinds de vorige verversing veranderde, dus hij verschijnt een cyclus lang en vervaagt weer. Wil je een doorlopend overzicht van alles wat bewogen is sinds je begon te kijken, vraag dan om de permanente vorm:

$ watch -d=permanent -n 5 df -h        # every cell that has EVER changed stays lit

Die variant is de betere om bij weg te lopen. Kom tien minuten later terug en het scherm vertelt je welke bestandssystemen bewogen terwijl je weg was, in plaats van alleen wat er in de laatste vijf seconden gebeurde.

Er is een ding dat -d volledig onderuithaalt, en dat is het weten waard voordat je op de markering vertrouwt. watch vergelijkt het scherm positie voor positie, niet regel voor regel. Verschuiven de regels, dan telt elk teken na die verschuiving als veranderd:

# three rows, one value changes in place
alpha 1        alpha 1
beta  2   ->   beta  9        highlighted spans: 1
gamma 3        gamma 3

# the same three rows, same values, different order
alpha 1        gamma 3
beta  2   ->   alpha 1        highlighted spans: 4
gamma 3        beta  2

In het tweede geval veranderde er niets, en lichtte -d vier keer zoveel op. Dat is precies wat er gebeurt met watch -d 'ps aux --sort=-%cpu': processen wisselen voortdurend van plaats, het hele scherm knippert, en de markering vertelt je niets. Sorteer in plaats daarvan op iets stabiels, op naam of op PID, en laat de getallen binnen vaste regels bewegen.

4.3 De kopregel uitzetten

-t (afkorting van no-title) haalt de kopregel en de lege regel eronder weg, wat je twee regels extra uitvoer en een nettere schermafbeelding oplevert:

$ watch -t -n 1 uptime

Gebruik het als de uitvoer hoog is en je de ruimte nodig hebt. Houd de kopregel als je aan het debuggen bent, want de tijdstempel is hoe je een hangend commando van een rustig commando onderscheidt.

4.4 Kleur

Veel commando's tonen kleur als ze denken dat er een terminal meekijkt. watch haalde die codes vroeger weg tenzij je -c meegaf, en sinds procps-ng 4.0.4 interpreteert hij ze standaard:

$ watch -c ...      # interpret ANSI colour (now the default)
$ watch -C ...      # do NOT interpret it, print the codes as text

De meeste tools moet je nog steeds vertellen dat je kleur wilt, want ze zien een pipe in plaats van een terminal en zetten het zelf uit:

$ watch 'ls --color=always -l'
$ watch 'grep --color=always ERROR /var/log/app.log'
$ watch 'systemctl --no-pager status nginx'

Die --no-pager is hetzelfde idee in een ander jasje. Alles wat normaal less opent moet je verbieden dat te doen, anders toont watch je een pager die wacht op invoer die nooit komt.

Naar boven

5. Gemiddelde toepassingen

5.1 De aanhalingsregel, en dat is het hele spel

Hier komt meer watch-verwarring vandaan dan uit al het andere bij elkaar. Je shell verwerkt de opdrachtregel voordat watch hem ooit ziet. Daarna geeft watch wat overblijft aan sh -c, een tweede shell, bij elke verversing opnieuw.

Twee shells, en het verschil is zichtbaar. Hier hetzelfde commando op drie manieren geschreven, waarbij de buitenste shell zelf PID 468449 heeft:

$ echo $$
468449

$ watch -t echo $$
468449                             # frozen: YOUR shell expanded it, once

$ watch -t echo '$$'
468474                             # a new number every refresh: watch's sh did it
468476
468478
468480

$ watch -t -x echo '$$'
$$                                 # no shell at all, so nothing expanded it

Lees die drie uitkomsten tot ze kloppen, want ze vormen samen het hele model. Zonder aanhalingstekens vervangt jouw shell de waarde een keer en herhaalt watch eeuwig een vaste tekst. Met aanhalingstekens gebeurt de vervanging binnen watch, elke cyclus vers. Met -x is er geen shell om iets te vervangen.

De praktische regel is kort: bevat het commando iets waar de shell om geeft, zet er dan aanhalingstekens omheen. Dat betekent $, |, >, &&, *, backticks en puntkomma's.

5.2 Pipes horen binnen de aanhalingstekens

Dit is dezelfde regel, maar hij verdient een eigen demonstratie omdat het misgaan stil verloopt in plaats van luid:

$ watch ls /etc | head -3
# the whole of /etc fills the screen.
# the pipe applied to WATCH's output, not to ls.

$ watch 'ls /etc | head -3'
adduser.conf
alsa
alternatives                       # correct

In het eerste geval gaat er niets fout. Jouw shell bouwde een pipeline met watch zelf erin, watch nam toch het scherm over, en head zat daar zonder iets nuttigs te doen. Je krijgt een geloofwaardig ogend scherm dat niet is wat je vroeg, en dat is de vervelendste soort fout.

Dezelfde valkuil geldt voor omleiding en voor ketenen:

$ watch 'systemctl is-active nginx && curl -s -o /dev/null -w "%{http_code}" localhost'
$ watch 'tail -5 /var/log/syslog 2>&1'

5.3 Wanneer je -x gebruikt

-x (afkorting van exec) slaat de sh -c helemaal over en draait je commando rechtstreeks. Gebruik het als die extra shell je meer last dan hulp bezorgt:

$ watch -x kubectl get pods -o wide
$ watch -x php artisan queue:monitor default

De ruil is dat je elke shellfunctie kwijtraakt. Pipes, omleidingen, variabelen en jokertekens houden op bijzonder te zijn en worden gewone argumenten:

$ watch -x ls /etc '|' head
ls: cannot access '|': No such file or directory
ls: cannot access 'head': No such file or directory

Heb je zowel een pipeline als -x nodig, dan moet je de shell zelf leveren, en dan kun je -x net zo goed weglaten:

$ watch -x sh -c 'echo ok | tr a-z A-Z'
OK

In de praktijk verdient -x zijn plaats bij commando's met lastige argumenten, JSON, accolades, aanhalingstekens binnen aanhalingstekens, waar het nesten goed krijgen voor sh -c meer moeite kost dan de shell waard is.

5.4 Je krijgt alleen het eerste scherm

watch toont wat past en gooit de rest weg. Hij scrollt niet, hij pagineert niet, en er is geen toets om meer te zien. Een bestand van honderd regels in een terminal van tien regels toont er acht:

$ seq 1 100 > hundred.txt
$ watch cat hundred.txt            # in a 10-row terminal

Every 2.0s: cat hundred.txt                   xps: Sun Aug 23 21:17:11 2026

1
2
3
4
5
6
7
8                                  # lines 9 to 100 are simply gone

Dit is geen bug om te omzeilen, het is een beperking om voor te ontwerpen. Laat het commando een samenvatting maken in plaats van een uitstorting:

$ watch 'tail -20 /var/log/nginx/error.log'
$ watch 'ls -1 /var/spool/queue | wc -l'
$ watch 'df -h | grep -E "^/dev|Filesystem"'
$ watch 'ps aux --sort=-%mem | head -12'

Die laatste is het patroon om je eigen te maken: sorteer op wat je belangrijk vindt, en neem dan de bovenste paar. Een scherm dat altijd past is een scherm dat je in een oogopslag leest, en dat is het hele doel van de tool.

5.5 Lange regels

Standaard breekt een regel die langer is dan de terminal af naar de volgende regel, wat je beperkte verticale ruimte opeet en een tabel onleesbaar maakt. -w kapt hem in plaats daarvan af:

$ watch -w 'ps aux --sort=-%cpu | head -15'

Voor alles met kolommen is afkappen bijna altijd de betere keuze: een afgekapte tabel loopt nog steeds recht, een afgebroken tabel niet.

5.6 De eigen bestanden van de kernel bekijken

watch en het /proc-bestandssysteem zijn voor elkaar gemaakt, en de reden is een detail dat de meeste mensen nooit opvalt. De bestanden in /proc zijn geen bestanden. Ze hebben geen inhoud tot je ze leest, en de kernel maakt het antwoord op dat moment aan:

$ ls -l /proc/meminfo /proc/loadavg
0 /proc/loadavg
0 /proc/meminfo                    # zero bytes, both of them

$ cat /proc/uptime
215685.54 3283350.21
$ cat /proc/uptime
215686.54 3283365.06               # a second later, a fresh answer

Elke verversing is dus een werkelijk nieuwe meting van levende kernelstatus, gedaan met niets exotischers dan cat. Daarmee komt een groot deel van wat de kernel weet binnen bereik van een commando van een regel:

$ watch -d 'cat /proc/loadavg'
$ watch -d 'cat /proc/meminfo'
$ watch -d 'grep -E "^(procs_running|procs_blocked)" /proc/stat'
$ watch -n 2 'cat /proc/mdstat'              # a RAID rebuild, the classic use
$ watch -d 'cat /proc/net/dev'

/sys werkt hetzelfde voor hardware- en driverstatus, meestal een waarde per bestand:

$ watch -n 5 'cat /sys/class/thermal/thermal_zone0/temp'
20000                              # millidegrees, so 20 C

$ watch -n 1 'cat /sys/class/net/eth0/statistics/rx_bytes'

Die laatste komt met de belangrijkste beperking uit dit hele artikel, en hij treft mensen die watch verder goed gebruiken. rx_bytes is een totaal, geen snelheid. Hij klimt alleen maar, en hem zien klimmen zegt je niets over hoe snel het verkeer loopt.

Voor een snelheid heb je twee metingen nodig en de tijd ertussen, en watch houdt geen herinnering aan de vorige verversing. Hij kan niet aftrekken. Alles in de vorm "per seconde" valt dus buiten wat hij kan, hoe kort het interval ook is:

$ vmstat 1                         # rates, with scrolling history
$ iostat -x 2                      # per-device I/O rates
$ sar -n DEV 1                     # network rates, and it keeps the history
$ watch -n 1 'cat /sys/class/net/eth0/statistics/rx_bytes'   # a climbing total

De algemene vorm van de regel: watch is uitstekend in het tonen van een waarde, en niet in staat een verandering over tijd te tonen, verder dan de hint van een cyclus die -d geeft. Paragraaf 7.5 gaat over de gevolgen daarvan.

Naar boven

6. Gevorderde toepassingen

6.1 Stoppen met kijken als er iets gebeurt

Dit is de functie die van watch een weergave maakt waarop je kunt bouwen, en bijna niemand weet dat hij bestaat. -g (afkorting van chgexit) stopt zodra de uitvoer afwijkt van de vorige run:

$ watch -g -n 5 'systemctl is-active nginx'
# ... sits there while the answer stays "active" ...
# ... the moment it becomes "inactive", watch exits

Daarmee kun je op een voorwaarde wachten zonder een polling-lus te schrijven. Het commando wordt een blokkerende bewerking die je in een script kunt zetten:

$ watch -g -n 10 'ls /var/spool/upload | wc -l' && echo "the queue changed"
$ watch -g -n 2 'curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/'

-q (afkorting van equexit) is het spiegelbeeld: stoppen wanneer de uitvoer een opgegeven aantal cycli niet meer verandert. Dat is het geval "wacht tot het tot rust komt", en dat komt voortdurend voor bij kopieeracties, uitrollen en imports:

$ watch -q 5 -n 2 'du -s /var/backups'
# exits once the size has been identical for 5 consecutive checks

Samen dekken die twee het meeste af waarvoor mensen shell-lussen schrijven. -g is "zeg het als het beweegt", -q is "zeg het als het stopt".

6.2 Stoppen met kijken als er iets stukgaat

-e (afkorting van errexit) bevriest de weergave wanneer het commando met een fout eindigt, zodat de mislukking op het scherm blijft in plaats van twee seconden later te worden weggeveegd. Daarna wacht hij op een toetsaanslag voordat hij stopt:

$ watch -e -n 5 'curl -sf https://example.test/health'

Zonder -e flitst een tijdelijke storing voorbij en verdwijnt, en besteed je tien minuten aan de vraag of je het je verbeeld hebt. Met -e staat het scherm stil op precies het moment dat het misging.

-b (afkorting van beep) laat de terminalbel klinken bij een fout in plaats van te stoppen, en dat is de juiste keuze als je wilt blijven kijken maar ook gewaarschuwd wilt worden:

$ watch -b -n 30 'systemctl is-active postgresql'

6.3 Nauwkeurige intervallen

Paragraaf 1.3 liet de afwijking zien: interval plus looptijd, elke cyclus. -p (afkorting van precise) laat watch op het interval zelf mikken, door af te trekken hoe lang het commando duurde. Het verschil is makkelijk te meten met een commando dat voorspelbaar 0,3 seconde kost:

$ watch -n 1 'date +%s.%N >> t.log; sleep 0.3'
gaps:      1.303  1.305  1.304  1.303  1.303
fractional: 0.55   0.85   0.15   0.46   0.76      # drifting away

$ watch -p -n 1 'date +%s.%N >> t.log; sleep 0.3'
gaps:      1.001  1.000  1.000  1.000  1.000
fractional: 0.56   0.56   0.56   0.56   0.56      # pinned

Kijk naar de decimalen van de seconden, niet naar de tussenpozen. Zonder -p dwalen ze door de hele seconde. Met -p blijven ze staan, omdat watch nu op de klok mikt in plaats van te tellen vanaf het moment dat de vorige run toevallig klaar was.

Gebruik -p als je wat je ziet koppelt aan iets anders op een timer: een cronjob, het ophalen van metrics, een log dat op de minuut roteert. Sla het anders over, want voor een commando dat direct terugkomt maakt het niets uit.

6.4 watch in een script gebruiken (en wanneer niet)

De afsluitcode is waar verwachting en werkelijkheid uit elkaar lopen. Een gewone Ctrl-C is niet het interessante geval; wat telt is wat de voorwaarde-opties teruggeven, en wat er met de afsluitcode van je eigen commando gebeurt:

$ watch -g -n 1 'cat f.txt'        # output changed
$ echo $?
0

$ watch -q 2 -n 0.3 'sh -c "exit 42"'
$ echo $?
0                                  # NOT 42: the command's code is not passed on

$ watch -e -n 0.5 false            # then press a key
$ echo $?
8

Die 8 is gedocumenteerd. De tabel met afsluitcodes in de handleiding noemt hem "getting child process return value with waitpid(2) failed, or command exited up on error", en dat is de code die je krijgt als --errexit zijn werk doet.

De eerlijke conclusie is dat watch een tool is voor een mens achter een terminal, en dat alleen -g en -q hem scriptbaar maken. Schrijf voor alles wat onbeheerd draait de lus, en houd de afsluitcode in eigen hand:

until curl -sf https://example.test/health >/dev/null; do
    sleep 5
done

Die lus werkt ook op een BSD, in een container zonder procps, en op de machine waar iemand watch verwijderd heeft. Paragraaf 3 behandelde waarom dat uitmaakt.

6.5 Wat watch niet kan zien

watch draait je commando met sh -c, en op Debian en Ubuntu is /bin/sh gelijk aan dash, niet aan je interactieve Bash. Alles wat alleen binnen je eigen shell bestaat is daardoor onzichtbaar:

$ alias ll='ls -l'
$ watch ll
sh: 1: ll: not found

$ greet() { echo hi; }
$ export -f greet
$ watch greet
sh: 1: greet: not found            # exported bash functions do not reach dash

Omgevingsvariabelen die je geëxporteerd hebt overleven wel, want die worden gewoon geerfd. Aliassen, shellfuncties en builtins die specifiek van Bash zijn niet. Schrijf het echte commando uit, of wijs naar een script op schijf:

$ watch 'ls -l'
$ watch ~/bin/check-queue.sh
$ watch 'bash -ic "ll"'            # possible, but rarely worth it
Naar boven

7. Iets wat de meeste gebruikers niet weten

7.1 Een traag commando laat watch tegen je liegen

Paragraaf 1.3 liet zien dat het interval een pauze is. Er is een ergere versie van hetzelfde probleem, en de handleiding geeft het toe in de BUGS-sectie in plaats van het te verbergen. Duurt het commando soms langer dan het interval, dan kan watch herhaaldelijk gaan vuren om bij te komen:

BUGS
       --precise mode doesn't yet have advanced temporal distortion technology
       to compensate for a command that takes more than --interval seconds to
       execute.  watch also can get into a state where it rapid-fires as many
       executions of command as it can to catch up from a previous executions
       running longer than --interval (for example, netstat(8) taking ages on
       a DNS lookup).

Dat is een echt gevaar als het bekeken commando duur is. watch -n 1 op een query die meestal 200 ms kost en af en toe vier seconden slaat niet netjes een beurt over; hij kan datgene wat hij bevraagt gaan afhameren. Twee gewoontes voorkomen dat: stel het interval royaal boven het slechtste geval in in plaats van boven het typische geval, en kies liever een goedkope vervanger voor een dure controle. Een teller bekijken is veiliger dan bekijken wat er geteld wordt.

7.2 Elke verversing is een gloednieuw proces

De PID's in paragraaf 5.1 waren geen curiositeit, ze waren het mechanisme. Elke cyclus start een verse sh, die op zijn beurt je commando start. Er gaat niets mee tussen verversingen: geen mapwijzigingen, geen variabelen, geen enkele shellstatus.

$ watch -t 'echo $$ >> pids.log'
$ cat pids.log
468474
468476
468478
468480                             # a new shell every single time

Daar volgen drie dingen uit. Een commando met neveneffecten voert die neveneffecten bij elke verversing uit, dus watch 'curl -X POST ...' is een manier om iets een paar honderd keer voor de lunch te versturen. Een teller die je in een variabele ophoogt begint elke cyclus opnieuw. En op een kort interval start je voor altijd twee processen per cyclus, wat goedkoop is maar niet gratis, en dat is het onthouden waard voordat je -n 0.1 op een drukke productiemachine zet.

7.3 Niet-afdrukbare tekens worden verwijderd

watch haalt stilletjes stuurtekens uit de uitvoer in plaats van ze door te geven, en dat is verstandig omdat een losse escapereeks het scherm zou verpesten dat hij juist probeert te beheren. Maar het betekent wel dat wat je ziet niet altijd is wat het commando produceerde:

$ printf 'a\tb\001c\n' > np.txt      # a, tab, control-A, c
$ cat -A np.txt
a^Ib^Ac$                           # the file really does contain it

# search what reached the terminal for that byte:
$ watch -t cat np.txt
raw 0x01 bytes: 0    visible "^A": 0     # gone without a trace

$ watch -t 'cat -v np.txt'
raw 0x01 bytes: 0    visible "^A": 1     # cat -v turned it into text first

De handleiding beveelt precies die oplossing aan. Gebruik je watch om een opmaakprobleem op te sporen, in een bestand met vreemde regeleindes, in uitvoer van een programma dat iets raars uitstoot, zet dan cat -v aan het eind van de pipeline of je kijkt naar een opgepoetste versie van het bewijs.

7.4 watch is geen bestandsbewaker

Dit is de fout die de meeste tijd kost, want watch lijkt te werken. Richt hem op een build en hij ververst inderdaad, dus er ziet niets er kapot uit; hij doet alleen het verkeerde werk op het verkeerde moment.

De kernel heeft een interface voor het juiste werk, inotify, en die vertelt je het moment dat een bestand verandert in plaats van tot N seconden later. De tools die daarop gebouwd zijn wil je hebben:

Wat je wiltGebruik
Een commando elke N seconden draaien en bekijken watch
Een commando draaien zodra een bestand verandert entr, of de eigen watch-modus van een framework
Bestandssysteemgebeurtenissen melden zodra ze plaatsvinden inotifywait uit inotify-tools
Een log volgen terwijl er regels bij komen tail -f, of less +F
Het systemd-journaal volgen journalctl -f
Een waarde over tijd volgen, met historie viddy of hwatch, die eerdere uitvoer bewaren
$ ls *.c | entr -c make            # rebuild the instant a source file is saved
$ inotifywait -m -e close_write /var/spool/incoming

De vuistregel: zendt datgene waar je om geeft een gebeurtenis uit, luister dan naar die gebeurtenis. Gebruik watch voor toestand die niets aankondigt, en dat is het meeste van wat een server doet. Schijfgebruik, aantallen verbindingen, wachtrijlengte en processenlijsten hebben geen meldingsmechanisme, en die op een timer bevragen is precies goed.

7.5 Hij bemonstert, dus hij mist dingen

watch toont je het heden en vergeet het meteen. Beide helften van die zin kosten mensen tijd.

Het vergeten komt eerst. Stel dat de belasting op een server dit doet:

12:00   0.4
12:01   0.5
12:02   8.7        <- the thing you were called about
12:03   0.6

Je start watch uptime om 12:03 en ziet 0,6. Niet "0,6, en daarvoor was het ook prima": alleen 0,6, zonder enige manier om het verschil te zien tussen een server die de hele ochtend rustig was en een die zestig seconden geleden omviel. -d=permanent helpt een beetje vanaf het moment dat je begint, en geen seconde verder terug.

Het missen komt daarna, en dat is het subtielere. Tussen twee verversingen kijkt watch niet. Alles wat korter is dan het interval kan zich volledig in dat gat afspelen:

interval:   |-----2s-----|-----2s-----|-----2s-----|
sampled:    X            X            X
the event:        [==1.5s==]                            never seen

Het interval verkorten maakt het gat smaller maar sluit het nooit, en het kost elke cyclus meer. Die ruil is het duidelijk benoemen waard, want hij is helemaal niet eigen aan watch:

short interval   better resolution, more overhead, more load on what you watch
long interval    less overhead, more that happens invisibly between samples

Dezelfde ruil bepaalt elk metrics-systeem, elke SNMP-poll en elke healthcheck die je ooit instelt. watch is een goede plek om hem tegen te komen, want hier is de prijs van een verkeerde keuze niet meer dan een verwarrend scherm.

Twee gewoontes volgen daaruit. Onderzoek je iets dat af en toe optreedt, log het dan in plaats van het te bekijken, zodat er achteraf iets te lezen valt:

$ while true; do printf '%s %s\n' "$(date +%T)" "$(cut -d' ' -f1 /proc/loadavg)"; sleep 5; done | tee load.log

En wil je weten wat er gebeurde voordat je aankwam, aanvaard dan dat dit niet het werk van watch is. Gebruik wat de historie al bewaarde: sar, het journaal, de logs van je eigen applicatie, of een monitoringsysteem. watch beantwoordt "wat gebeurt er nu", en alleen dat.

7.6 Kleur werd de standaard, en dat veranderde oude commando's

procps-ng 4.0.4 zette ANSI-interpretatie standaard aan. De Debian-changelog legt het vast in een regel:

$ zcat /usr/share/doc/procps/changelog.Debian.gz | grep -i "watch:"
  * watch: Color support turned on by default use -C to turn off

Je ziet de omslag door de kleurcodes te tellen die overleven:

# command emits ESC[31m for red
$ watch ...        SGR-31 sequences passed through: 1     # interpreted
$ watch -c ...     SGR-31 sequences passed through: 1     # same, -c is now redundant
$ watch -C ...     SGR-31 sequences passed through: 0     # stripped

Meestal is dit een verbetering. Het bijt op een specifieke plek: bij een commando waarvan je de uitvoer juist om de escapecodes leest, worden die nu opgeslokt. Gebruikte je watch om ruwe gekleurde uitvoer te bekijken, voeg dan -C toe. En kom je een tutorial tegen die volhoudt dat je -c nodig hebt, dan is die van voor 2023 en is de rest van het advies mogelijk net zo verouderd.

7.7 Weten waar watch ophoudt

watch is een kleine tool en hij is eerlijk over zijn omvang. Het punt waarop je moet ophouden hem op te rekken:

Als je nodig hebtGrijp naar
Terugscrollen, of uitvoer hoger dan het scherm viddy, of omleiden naar een bestand en dat lezen
Zien wat de waarde vijf minuten geleden was viddy, hwatch, of loggen en in een grafiek zetten
Waarschuwen als een drempel overschreden wordt Een monitoringsysteem, geen terminal
Iets onbeheerd of in een script Een shell-lus (paragraaf 6.4), of een systemd-timer
Meerdere waarden naast elkaar tmux-panelen, in elk een watch
Draaien buiten Linux Een shell-lus; watch zit niet in POSIX

Nog voor al die dingen is er echter een goedkopere vraag te stellen, en die slaan mensen over: weet het commando al hoe het zichzelf moet herhalen? Verrassend veel commando's weten dat, en hun eigen modus is bijna altijd beter dan ze inpakken:

In plaats vanGebruikWaarom dat beter is
watch free -h free -h -s 2 Een proces in plaats van twee starts per cyclus
watch vmstat vmstat 1 Geeft snelheden, en scrollt zodat de historie blijft
watch iostat iostat -x 2 Idem: echte snelheden, met historie
watch 'tail /var/log/x' tail -f /var/log/x Direct, en mist niets tussen verversingen
watch 'journalctl -n 20' journalctl -f Gebeurtenisgestuurd, helemaal geen polling
watch docker ps docker stats of docker events Live stroom vanuit de daemon
watch kubectl get pods kubectl get pods -w Gebruikt de watch-semantiek van de API zelf

Kijk goed naar de tweede en derde regel, want die zijn niet alleen netter. vmstat 1 en iostat -x 2 drukken elk interval een nieuwe regel af en laten die doorscrollen, en daarmee geven ze je de twee dingen waarvan paragraaf 7.5 zei dat watch ze structureel niet kan: snelheden, en een historie om in terug te kijken. Biedt een tool zijn eigen herhaalmodus, dan biedt hij die twee er meestal bij.

Die vijfde regel is het proberen waard als je tmux al hebt. Drie panelen met watch -d op schijf, verbindingen en wachtrijlengte maken een bruikbaar dashboard uit tools die je al hebt:

$ tmux new-session -d 'watch -d -n 5 df -h'
$ tmux split-window -h 'watch -d -n 2 "ss -tn state established | wc -l"'
$ tmux split-window -v 'watch -d -n 5 "ls /var/spool/queue | wc -l"'
$ tmux attach
Naar boven

8. Best practices

  • Zet aanhalingstekens om het commando zodra er shellsyntaxis in zit. Een pipe, een $, een omleiding, een jokerteken, een puntkomma. Zonder aanhalingstekens pakt jouw shell het en ziet watch het nooit, en het misgaan verloopt stil in plaats van luid.
  • Gebruik bijna altijd -d. Zonder die optie staar je naar een muur tekst in de hoop een cijfer te zien veranderen. Met die optie wordt je oog meteen naar het bewegende deel getrokken.
  • Grijp naar -d=permanent als je wegloopt. Die bewaart elke wijziging sinds je begon, zodat het scherm je tien minuten later nog iets te vertellen heeft.
  • Laat de uitvoer op het scherm passen. watch toont het eerste scherm en gooit de rest stilletjes weg. Stuur het door head, tail, wc -l of een grep, en sorteer zo dat de interessante regels bovenaan staan.
  • Voeg -w toe bij alles met kolommen. Een afgekapte tabel loopt nog recht; een afgebroken tabel is onleesbaar en eet de verticale ruimte op die je niet hebt.
  • Stel het interval in op het slechtste geval, niet op het typische. Een commando dat af en toe vier seconden kost hoort niet op -n 1, anders gaat watch snelvuren om bij te komen.
  • Richt een kort interval niet op iets duurs. Bekijk een goedkope teller in plaats van datgene wat geteld wordt, en onthoud dat elke cyclus twee processen start.
  • Zet nooit een commando met neveneffecten onder watch. Alles wat schrijft, verstuurt, mailt of verwijdert draait bij elke verversing opnieuw.
  • Leer -g en -q. "Stop als dit verandert" en "stop als dit tot rust komt" vervangen de meeste polling-lussen die mensen met de hand schrijven, en ze combineren met &&.
  • Gebruik -e als je een sporadische storing zoekt. Die bevriest het scherm op het moment dat het commando faalde in plaats van het bewijs twee seconden later weg te vegen.
  • Voeg -p toe als je koppelt aan een andere klok. Een cronjob, het ophalen van metrics, een log dat op de minuut roteert. Sla het anders over.
  • Vertel het bekeken commando dat je kleur wilt en geen pager. --color=always en --no-pager, want vanuit watch kan het commando niet zien dat het tegen een scherm praat.
  • Houd geheimen uit het commando. watch houdt zijn argumenten de hele run in de processentabel, dus een wachtwoord op de opdrachtregel ligt minutenlang open voor elke gebruiker in plaats van milliseconden.
  • Vraag je af of het commando zichzelf al herhaalt. free -s, vmstat 1, iostat -x 2, tail -f, journalctl -f, kubectl -w. Hun eigen modus geeft meestal snelheden en historie die watch niet kan geven.
  • Grijp naar /proc en /sys. Die bestanden worden bij elke leesactie vers aangemaakt, dus cat plus watch maakt van het meeste dat de kernel weet een levende weergave.
  • Schrijf een lus voor alles wat onbeheerd draait. watch geeft de afsluitcode van je commando niet door, en hij zit niet in POSIX, dus hij bestaat misschien niet op de volgende machine.
  • Onthoud dat het geen bestandsbewaker is. Zendt datgene waar je om geeft een gebeurtenis uit, gebruik dan entr, inotifywait of tail -f en krijg het antwoord direct.
  • Lees de handleiding een keer goed. Hij is kort, en zijn BUGS-sectie is ongewoon eerlijk over het snelvuurprobleem en de weggehaalde stuurtekens.
$ man 1 watch              # short, and worth reading end to end
$ watch --help             # the full option list, one screen
$ watch --version          # check before relying on -q, -r or -w
$ man 1 entr               # the event-driven counterpart
$ man 1 tmux               # for several watches side by side
Naar boven

9. Veelgemaakte fouten

9.1 watch versus een shell-lus

Vrijwel iedereen schrijft de lus voordat hij het commando leert kennen, en die lus is een volstrekt redelijk ding om te schrijven. Het is goed om helder te hebben wat je wint en wat je opgeeft, want het antwoord is niet "de lus is slechter".

$ while true; do clear; df -h; sleep 5; done

Dat is het eerlijke equivalent, en voor een snelle blik is het prima. Dit is wat watch -n 5 df -h toevoegt:

Eigenschapwatchwhile-lus
Hertekenen zonder flikkeren Ja, hij tekent op zijn plaats bij clear maakt het scherm eerst leeg, dus het flikkert
Markeren wat er veranderde -d Niets, tenzij je zelf een vergelijker schrijft
Kopregel met tijdstempel Ingebouwd Voeg je zelf toe
Stoppen bij een voorwaarde -g, -q, -e Schrijf de test en break
Interval dat de looptijd meerekent -p Rekenwerk dat je zelf doet
Eigen logica, loggen, opnieuw proberen, terugvallen Nee Ja, hier wint de lus
De afsluitcode van je commando Wordt niet doorgegeven Van jou om te gebruiken
Werkt op een BSD of in een minimale container Nee, het zit niet in POSIX Ja
Terugscrollen Geen, alleen het eerste scherm Ja, als je de clear weglaat

De scheiding is helder zodra je hem ziet. watch is om te kijken; een lus is om te doen. Gaat er een mens zitten en het scherm lezen, dan wint watch -d op elk punt dat ertoe doet. Zodra er iets met het antwoord moet gebeuren, gelogd, opnieuw geprobeerd of teruggegeven aan een aanroeper, schrijf je de lus, want watch kan het resultaat niet doorgeven (paragraaf 6.4).

Die laatste regel vergeet je makkelijk. De clear weglaten maakt van de lus iets wat watch helemaal niet kan: een doorscrollend verslag waarin je achteraf kunt terugbladeren, en paragraaf 7.5 betoogde dat dat vaak is wat je eigenlijk wilde.

9.2 Mythe versus werkelijkheid

MytheWerkelijkheid
"-n 5 draait het elke vijf seconden." Hij wacht vijf seconden nadat elke run klaar is. Een commando van twee seconden op -n 0.5 loopt elke 2,5 s rond.
"watch bewaakt bestanden, zoals de watch-modus van een buildtool." Hij weet niets van bestanden. Hij draait een commando op een timer. Voor bestandsgebeurtenissen gebruik je entr of inotifywait (paragraaf 7.4).
"watch ls | grep foo filtert de lijst." Jouw shell zette de uitvoer van watch zelf door de pipe. De pipe moet binnen de aanhalingstekens, en niets waarschuwt je.
"watch echo $HOME evalueert elke cyclus opnieuw." Jouw shell verving het een keer, voordat watch startte. Zet er aanhalingstekens omheen voor een verse waarde per cyclus.
"Mijn alias werkt overal, dus ook hier." watch gebruikt sh -c, en dat is op Debian en Ubuntu dash. Aliassen en shellfuncties bestaan daar niet.
"De uitvoer scrolde weg, ik kan terugscrollen." Er is geen terugscrollen. Alles voorbij het eerste scherm is nooit getekend. Laat het commando minder produceren.
"watch geeft de afsluitcode van mijn commando terug." Nee. watch -q 2 'sh -c "exit 42"' eindigt met 0. Alleen -e levert een eigen status op, en die is 8.
"-c is hoe je kleur krijgt." Sinds procps-ng 4.0.4 staat kleur standaard aan en is -c overbodig. -C is nu degene die iets doet.
"Druk op q om te stoppen." Ctrl-C. watch is geen pager en leest geen toetsen, op de ene toetsaanslag na waar -e op wacht.
"De kopregel bevroor, dus watch is gecrasht." De tijdstempel in de kopregel loopt bij elke verversing op. Een bevroren tijdstempel betekent dat je commando niet terugkomt.
"-p garandeert het interval." Hij mikt op de klok in plaats van te tellen vanaf de vorige afronding. Duurt het commando langer dan het interval, dan zegt de handleiding ronduit dat hij dat niet kan compenseren.
"Het is standaard, dus het staat op elke Unix." watch zit niet in POSIX. Het komt van Linux procps-ng, en het ontbreekt op BSD, op een kale macOS en in minimale containers.
"Een wachtwoord op de opdrachtregel ligt maar heel even open." Hier niet. watch houdt het hele commando in zijn eigen argumentenlijst zolang hij draait, dus ps laat het onafgebroken aan elke gebruiker op de machine zien.
"-d laat zien wat er veranderde." Hij vergelijkt schermposities. Verschuif de regels en hij licht alles op, en daarom is watch -d op een lijst met --sort=-%cpu nutteloos (paragraaf 4.2).
"Een kort genoeg interval vangt het wel op." Het maakt het gat smaller en sluit het nooit, en het kost elke cyclus meer. Alles wat korter is dan het interval kan nog steeds volledig onopgemerkt gebeuren (paragraaf 7.5).
"watch kan mij de overdrachtssnelheid laten zien." Hij heeft geen herinnering aan de vorige verversing, dus hij kan niet aftrekken. rx_bytes is een totaal dat alleen klimt. Gebruik vmstat, iostat of sar voor snelheden (paragraaf 5.6).
"Wat ik zie is precies wat het commando afdrukte." Niet-afdrukbare tekens worden weggehaald. Voeg cat -v toe als je iets debugt waar die op aankomen (paragraaf 7.3).

9.3 Andere valkuilen om te vermijden

  • Iets met neveneffecten bekijken. watch 'curl -X POST .../deploy' rolt elke twee seconden uit. Hetzelfde geldt voor alles met rm, mv, INSERT of een e-mail erin.
  • Een inloggegeven in een bekeken commando zetten. Het geheim staat de hele sessie in de argumentenlijst van watch, zichtbaar voor iedereen:
    $ watch -n 2 'mysql -u root -phunter2 -e "SHOW PROCESSLIST"'
    
    # from any other account on the box, for as long as it runs:
    $ ps -ef | grep watch
    pe7er  471478  watch -n 2 mysql -u root -phunter2 -e SHOW PROCESSLIST
    Gebruik een gegevensbestand met inloggegevens, een socket, of een omgevingsvariabele die het commando zelf uitleest. Een eenmalig commando flitst voorbij in de processentabel; een watch parkeert het daar.
  • Een commando bekijken dat op invoer wacht. git log, systemctl status en soortgenoten openen een pager, die daar vervolgens blijft staan. Voeg --no-pager toe, of zet PAGER=cat.
  • Een kort interval urenlang laten draaien. -n 0.1 is twintig processen per seconde, eindeloos. Prima voor een minuut debuggen, onbeleefd op een gedeelde server 's nachts.
  • sudo bekijken. sudo kan vanuit watch niet om een wachtwoord vragen, dus tenzij het gegeven al in de cache staat faalt elke verversing op dezelfde manier: sudo: a password is required. Authenticeer eerst, of start het geheel met sudo watch ... zodat de vraag een keer vooraf komt.
  • Vergeten dat het commando elke cyclus opnieuw ontleed wordt. Een relatief pad wordt opgelost vanaf de map waar je begon, wat prima is, maar een cd binnen het commando blijft niet staan tot de volgende verversing.
  • Verwachten dat -d een schermwijziging overleeft. De handleiding is expliciet: bij het aanpassen van de terminalgrootte wordt het scherm pas bij de volgende verversing hertekend, en gaat alle markering verloren.
  • watch gebruiken als monitoring voor de arme man. Hij heeft geen historie, geen waarschuwingen en geen verslag. Doet het er om drie uur 's nachts toe, dan hoort het in een monitoringsysteem.
  • Aannemen dat -x alleen maar netter quoten is. Het haalt de shell volledig weg, dus pipes, omleidingen, jokertekens en variabelen werken niet meer (paragraaf 5.3).
  • Een schermafbeelding van watch zonder kopregel vertrouwen. Met -t is er geen tijdstempel, dus een oude schermafbeelding ziet er precies zo uit als een actuele.
  • Ernaar grijpen op een trage verbinding. Elke verversing tekent het hele scherm opnieuw. Over een haperende SSH-sessie is een interval van een seconde erger dan nutteloos; verhoog het interval en verklein de uitvoer.
Naar boven

10. Samenvatting

watch is dertig jaar oud, past op een handleidingpagina, en de meeste mensen gebruiken een van zijn veertien opties. De twee ideeën die de rest ontsluiten zijn dat het interval een pauze is en geen schema, en dat je commando door twee shells gaat voordat het draait.

  • watch commando draait het elke twee seconden op een leeggemaakt scherm. Ctrl-C stopt; er is geen q.
  • De kopregel toont het interval, het commando zoals watch het ontving, de hostnaam en het tijdstip van de verversing. Een bevroren tijdstempel betekent dat je commando hangt.
  • Het interval is de pauze tussen runs, geen schema. De tijd van het commando komt er bovenop, en een commando dat trager is dan zijn interval kan watch laten snelvuren om bij te komen.
  • -n stelt het interval in, accepteert breuken en een komma, heeft een ondergrens van 0,1 s die hij stil toepast, en kan een keer gezet worden met WATCH_INTERVAL.
  • -d is de optie die watch de moeite waard maakt, en -d=permanent bewaart elke wijziging sinds je begon.
  • Zet aanhalingstekens om alles met shellsyntaxis. watch echo $$ drukt eeuwig de PID van jouw shell af; watch echo '$$' drukt elke cyclus een nieuwe af; watch -x echo '$$' drukt een letterlijke $$ af. Die drie uitkomsten zijn het hele model.
  • Een pipe buiten de aanhalingstekens wordt op watch zelf toegepast, en niets waarschuwt je. Zet hem erbinnen.
  • -x slaat de sh -c over, en haalt daarmee ook pipes, omleidingen, jokertekens en variabelen weg.
  • Je krijgt alleen het eerste scherm, zonder terugscrollen. Ontwerp het commando zo dat het past: head, tail, wc -l, en sorteer zodat het belangrijkste bovenaan staat. -w kapt lange regels af in plaats van ze af te breken.
  • -g stopt wanneer de uitvoer verandert en -q N stopt wanneer die N cycli niet meer veranderd is. Samen vervangen ze de meeste met de hand geschreven polling-lussen.
  • -e bevriest het scherm bij een fout zodat het bewijs blijft staan; -b piept alleen en gaat door.
  • -p mikt op de klok in plaats van te tellen vanaf de vorige afronding: gemeten gaan de decimalen van dwalen naar vastgepind op 0,56.
  • watch geeft de afsluitcode van je commando niet door, en hij zit niet in POSIX. Schrijf voor alles wat onbeheerd draait een until-lus.
  • Hij draait sh -c, dus je aliassen en shellfuncties bestaan niet, en elke verversing is een gloednieuw paar processen zonder overgedragen status.
  • Sinds procps-ng 4.0.4 wordt kleur standaard geinterpreteerd en zet -C het uit. Tutorials die zeggen dat je -c moet toevoegen zijn van voor 2023.
  • Bestanden in /proc en /sys worden bij het lezen aangemaakt en melden nul bytes, waardoor cat onder watch een levend venster op de kernelstatus wordt. Maar die tellers zijn totalen, geen snelheden: watch houdt geen herinnering aan de vorige verversing en kan dus niet aftrekken. Gebruik vmstat, iostat of sar voor alles per seconde.
  • Hij bemonstert, dus hij mist dingen. Alles wat korter is dan het interval kan zich volledig tussen twee verversingen afspelen, en het interval verkorten maakt dat gat smaller zonder het ooit te sluiten. Hij bewaart ook geen historie: begin om 12:03 met kijken en de piek van 12:02 heeft nooit bestaan.
  • Controleer voordat je een commando inpakt of het zichzelf al herhaalt. free -s, vmstat 1, tail -f, journalctl -f en kubectl -w geven meestal ook snelheden en terugscrollen.
  • Een lus is om te doen, watch is om te kijken. De lus wint zodra je logica, loggen, nieuwe pogingen of de afsluitcode nodig hebt (paragraaf 9.1).
  • Zet nooit een inloggegeven in een bekeken commando. Het staat in de processentabel, zichtbaar voor elke gebruiker, zolang de watch draait.
  • Het is geen bestandsbewaker. Gebruik voor gebeurtenissen entr, inotifywait, tail -f of journalctl -f. Gebruik watch voor toestand die niets aankondigt.

Dit is het overzicht dat het bewaren waard is:

THE ESSENTIALS
watch CMD                    every 2s, cleared screen, Ctrl-C to quit
watch -n 5 CMD               interval in seconds (fractions ok, floor 0.1)
watch -d CMD                 highlight what changed  <- use this
watch -d=permanent CMD       keep every change since you started
watch -t CMD                 no header (two more rows)
watch -w CMD                 truncate long lines instead of wrapping
export WATCH_INTERVAL=5      a personal default

QUOTING (the thing that catches everyone)
watch 'ls | head -3'         pipe INSIDE the quotes, or your shell eats it
watch 'echo $HOME'           quoted: re-expanded every cycle
watch echo $HOME             unquoted: expanded ONCE, then frozen
watch -x CMD                 no sh -c at all: no pipes, globs or variables

EXIT ON A CONDITION
watch -g CMD                 exit when the output CHANGES
watch -q 5 CMD               exit when it has NOT changed for 5 cycles
watch -e CMD                 freeze on error, quit on a key press (exit 8)
watch -b CMD                 beep on error, keep going
watch -p -n 1 CMD            aim at the clock, not at the last finish

MAKE IT FIT THE SCREEN (there is no scrollback)
watch 'tail -20 /var/log/nginx/error.log'
watch 'ps aux --sort=-%mem | head -12'
watch 'df -h | grep -E "^/dev|Filesystem"'
watch 'ls -1 /var/spool/queue | wc -l'
watch 'systemctl --no-pager status nginx'
watch 'ls --color=always -l'          # tell the command colour is wanted

DO NOT
watch anything with side effects      it runs again every refresh
watch a command that opens a pager    add --no-pager or PAGER=cat
watch -n 0.1 on a shared server       two forks per cycle, forever
watch expecting an exit code          it does not pass one out
watch expecting file events           use entr / inotifywait / tail -f

KERNEL STATE (these files are generated fresh on every read)
watch -d 'cat /proc/loadavg'
watch -d 'cat /proc/meminfo'
watch -n 2 'cat /proc/mdstat'         a RAID rebuild, the classic use
watch -n 10 'df -ih'                  INODES: free space and free inodes differ
watch -n 5 'cat /sys/class/thermal/thermal_zone0/temp'    millidegrees

CHECK FOR A NATIVE MODE FIRST (usually better than wrapping)
free -h -s 2        vmstat 1        iostat -x 2      sar -n DEV 1
tail -f FILE        journalctl -f   docker stats     kubectl get pods -w

interval = pause BETWEEN runs, never a schedule
frozen header timestamp = your command is hanging, not watch
no memory of the last refresh: watch shows totals, never rates
-d compares screen POSITIONS, so reordered rows light up everything

De snelste manier om hier waarde uit te halen is het ding kiezen dat je nu met pijltje omhoog controleert, en er een watch -d op zetten. Een schijf die vol loopt, een wachtrij die leegloopt, een certificaat dat vernieuwd wordt, een uitrol die gezond wordt: dat is allemaal een kort commando en een blik. En gedraagt een server zich op een manier die niemand kan verklaren, dan laten een paar watch -d-panelen op de juiste tellers je het patroon vaak sneller zien dan welk logbestand ook.

Naar boven
Linux commando: watch
Peter Martin
Peter Martin
Joomla Specialist

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.

Gerelateerde artikelen