
Linux commando: watch
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.
| Onderdeel | Betekenis |
|---|---|
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.
Naar bovenHet juiste mentale model:
watchis 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.
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.
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
| Tijdvak | Mijlpaal |
|---|---|
| 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 boven4. 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.
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.
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 boven7. 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 wilt | Gebruik |
|---|---|
| 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 hebt | Grijp 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 van | Gebruik | Waarom 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 boven8. 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 zietwatchhet 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=permanentals 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.
watchtoont het eerste scherm en gooit de rest stilletjes weg. Stuur het doorhead,tail,wc -lof eengrep, en sorteer zo dat de interessante regels bovenaan staan. - Voeg
-wtoe 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 gaatwatchsnelvuren 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
-gen-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
-eals 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
-ptoe 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=alwaysen--no-pager, want vanuitwatchkan het commando niet zien dat het tegen een scherm praat. - Houd geheimen uit het commando.
watchhoudt 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 diewatchniet kan geven. - Grijp naar
/procen/sys. Die bestanden worden bij elke leesactie vers aangemaakt, duscatpluswatchmaakt van het meeste dat de kernel weet een levende weergave. - Schrijf een lus voor alles wat onbeheerd draait.
watchgeeft 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,inotifywaitoftail -fen 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 boven9. 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:
| Eigenschap | watch | while-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
| Mythe | Werkelijkheid |
|---|---|
"-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 metrm,mv,INSERTof 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:
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 -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 PROCESSLISTwatchparkeert het daar. - Een commando bekijken dat op invoer wacht.
git log,systemctl statusen soortgenoten openen een pager, die daar vervolgens blijft staan. Voeg--no-pagertoe, of zetPAGER=cat. - Een kort interval urenlang laten draaien.
-n 0.1is twintig processen per seconde, eindeloos. Prima voor een minuut debuggen, onbeleefd op een gedeelde server 's nachts. sudobekijken.sudokan vanuitwatchniet 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 metsudo 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
cdbinnen het commando blijft niet staan tot de volgende verversing. - Verwachten dat
-deen 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. watchgebruiken 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
-xalleen 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
watchzonder kopregel vertrouwen. Met-tis 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.
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 commandodraait het elke twee seconden op een leeggemaakt scherm.Ctrl-Cstopt; er is geenq.- De kopregel toont het interval, het commando zoals
watchhet 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
watchlaten snelvuren om bij te komen. -nstelt 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 metWATCH_INTERVAL.-dis de optie diewatchde moeite waard maakt, en-d=permanentbewaart 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
watchzelf toegepast, en niets waarschuwt je. Zet hem erbinnen. -xslaat desh -cover, 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.-wkapt lange regels af in plaats van ze af te breken. -gstopt wanneer de uitvoer verandert en-q Nstopt wanneer die N cycli niet meer veranderd is. Samen vervangen ze de meeste met de hand geschreven polling-lussen.-ebevriest het scherm bij een fout zodat het bewijs blijft staan;-bpiept alleen en gaat door.-pmikt op de klok in plaats van te tellen vanaf de vorige afronding: gemeten gaan de decimalen van dwalen naar vastgepind op 0,56.watchgeeft de afsluitcode van je commando niet door, en hij zit niet in POSIX. Schrijf voor alles wat onbeheerd draait eenuntil-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
-Chet uit. Tutorials die zeggen dat je-cmoet toevoegen zijn van voor 2023. - Bestanden in
/procen/sysworden bij het lezen aangemaakt en melden nul bytes, waardoorcatonderwatcheen levend venster op de kernelstatus wordt. Maar die tellers zijn totalen, geen snelheden:watchhoudt geen herinnering aan de vorige verversing en kan dus niet aftrekken. Gebruikvmstat,iostatofsarvoor 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 -fenkubectl -wgeven meestal ook snelheden en terugscrollen. - Een lus is om te doen,
watchis 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 -fofjournalctl -f. Gebruikwatchvoor 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.


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












