SSD Nodes Learn 🎉 VPS vanaf $5.50/mnd
Gidsen Matt ConnorDoor Matt Connor · Bijgewerkt 2026-08-13

Linux watch commando: interval, diff en pipes gebruiken

Leer hoe u het watch commando effectief inzet in Linux. Gebruik de juiste vlaggen voor diff-highlighting, stel een interval in en ontdek hoe u pipes correct quote voor uitvoering.

Wat het commando watch doet

Het commando watch voert een ander commando met een vast interval opnieuw uit en ververst de uitvoer op dezelfde plek op het scherm. Het standaardinterval is twee seconden. Gebruik dit commando wanneer u wacht tot een waarde verandert: een schijf die volloopt, een container die opstart, een certificaatvernieuwing die wordt voltooid of een wachtrij die leegloopt.

watch is afkomstig van procps-ng en is op een nieuwe Ubuntu- of Debian-VPS al geïnstalleerd als onderdeel van het pakket procps. Controleer uw versie voordat u vertrouwt op de onderstaande vlaggen, aangezien twee van de nuttige opties recent zijn toegevoegd.

watch --version

Op Ubuntu 24.04 drukt dit een regel af zoals watch from procps-ng 4.0.4. Hier is het eenvoudigste nuttige voorbeeld.

watch df -h /

Het scherm wordt gewist en toont een kopregel, een lege regel en vervolgens de uitvoer van df -h /:

Every 2.0s: df -h /                          server1: Sun Aug  9 10:21:44 2026

Links ziet u het interval en het exacte commando dat watch uitvoert. Rechts staan de hostnaam en de huidige tijd. De klok is het nuttige deel, omdat deze bewijst dat het scherm nog steeds ververst wanneer de getallen eronder niet veranderen. Druk op Ctrl+C om af te sluiten.

watch tekent één frame dat in de terminal past. Lange regels worden afgebroken, maar -w kapt ze in plaats daarvan af, en alles wat buiten de onderste rij valt, wordt niet getekend. Er is geen scrollback binnen het frame, omdat elke cyclus de vorige overschrijft. Dat ene feit bepaalt grotendeels waarvoor watch geschikt is.

Hoe vaak moet watch het commando opnieuw uitvoeren?

Twee seconden is slechts de standaardwaarde. Kies het interval op basis van hoe snel de waarde verandert en hoeveel rekenkracht één uitvoering kost.

  • -n 0.5 voor tellers die constant veranderen, zoals ss -s of het aantal bytes op een interface. Het kleinste interval dat watch accepteert is 0,1 seconde.
  • -n 30 of -n 60 voor schijven en certificaten. Een bestandssysteem dat in de loop van een dag volloopt, heeft geen dertig frames per minuut nodig.

watch voert het commando uit, wacht tot het klaar is en gaat pas daarna slapen voor de duur van het interval. De uitvoeringstijd wordt bij de pauze opgeteld, dus een commando dat acht seconden duurt onder -n 2 levert u elke tien seconden een frame op en houdt de machine constant bezig. Voeg -p (--precise) toe en watch probeert in plaats daarvan elke interval-seconden een uitvoering te starten, gemeten vanaf het begin van de ene uitvoering tot het begin van de volgende.

Als u altijd een andere standaardwaarde wilt, exporteer dan WATCH_INTERVAL in uw shell-profiel. Een expliciete -n heeft nog steeds voorrang. Voer watch --help uit om te bevestigen dat uw build die variabele inleest.

Wijzigingen markeren met -d

Het lezen van een muur van identieke tekst om het ene veld te vinden dat is veranderd, is arbeidsintensief. -d (--differences) doet dit voor u.

watch -n 30 -d 'df -h / /var'

Tekens die afwijken van het vorige frame worden in omgekeerde video weergegeven, waardoor de Use%-cel oplicht zodra deze verandert terwijl de rest rustig blijft. Als /var geen afzonderlijk bestandssysteem is, ziet u het root-bestandssysteem dubbel vermeld; dit is een snelle manier om te achterhalen hoe de server is gepartitioneerd.

De vergelijking is positioneel, wat betekent dat watch de regels van het nieuwe frame teken voor teken vergelijkt met het oude. Output waarvan de kolombreedte verandert, zal bijna volledig oplichten; geef daarom de voorkeur aan commando's met een stabiele lay-out. De huidige procps-ng accepteert ook watch --differences=permanent, wat elke positie die ooit is veranderd gemarkeerd houdt in plaats van alleen de meest recente wijziging. Controleer dit met watch --help voordat u hierop vertrouwt.

Hoe zorg ik ervoor dat watch stopt wanneer de uitvoer verandert?

-g (--chgexit) stopt watch zodra de uitvoer verschilt van de vorige uitvoering. Uw prompt verschijnt weer, waardoor u direct daarna iets anders op dezelfde regel kunt plaatsen.

watch -n 10 -g 'systemctl is-active myapp' ; echo 'state changed'

Dit is de vlag die van watch een "meld mij wanneer de deploy is voltooid"-tool maakt. Er is één valkuil waar iedereen in trapt: de vergelijking omvat de volledige uitvoer. Elke klok of PID (process identifier) in de uitvoer verandert bij de eerste verversing, waardoor watch direct afsluit. systemctl status myapp toont de verstreken tijd en het geheugengebruik, dus -g is daarop zinloos. Beperk het commando tot het specifieke, stabiele gegeven waar u op wacht; dit is wat systemctl is-active u biedt.

Nieuwere versies van procps-ng voegen de tegenovergestelde test toe, --equexit <cycles>, die afsluit nadat de uitvoer gedurende dat aantal cycli gelijk is gebleven. Dit beantwoordt de vraag: "meld mij wanneer dit rustig is geworden". Controleer watch --help, aangezien oudere builds deze optie niet bevatten.

Waarom negeert watch mijn pipe en mijn glob?

Dit is een fout waar iedereen vroeg of laat tegenaan loopt, en de oorzaak ligt in uw shell in plaats van in watch.

watch docker compose ps | grep web

Uw interactieve shell leest de volledige regel voordat er iets wordt uitgevoerd, en splitst deze regel bij de pipe. Het start watch docker compose ps en verbindt de schermuitvoer van watch zelf met grep. watch schrijft niet langer naar een terminal, waardoor het display defect of leeg is, en grep filtert de hertekende uitvoer in plaats van een containerlijst.

Plaats de volledige pipeline tussen aanhalingstekens zodat deze als één argument binnenkomt.

watch 'docker compose ps | grep web'

watch geeft die string door aan sh -c, en die shell voert de pipeline per cyclus één keer uit. Globs volgen dezelfde regel met een minder opvallend symptoom.

watch ls -l /var/log/*.log
watch 'ls -l /var/log/*.log'

De eerste regel breidt de glob één keer uit, in uw shell, op het moment dat u op Enter drukt. watch voert daarna een bevroren lijst met bestandsnamen opnieuw uit, waardoor een logbestand dat een minuut later wordt aangemaakt nooit verschijnt. De tweede regel geeft de glob door aan watch, die deze in elke cyclus uitbreidt binnen sh, zodat nieuwe bestanden vanzelf verschijnen.

Aanhalingstekens bepalen ook wanneer een variabele of een command substitution wordt geëvalueerd. watch "echo $(date)" voert date één keer uit, in uw shell, en echo't daarna voor altijd die vaste string. watch 'echo $(date)' voert date elke cyclus uit. Enkele aanhalingstekens betekenen later. Dubbele aanhalingstekens betekenen nu.

Twee verdere gevolgen van die sh -c:

  • Aliassen en shell-functies bestaan er niet in. watch ll faalt met sh: 1: ll: not found, omdat sh -c uw .bashrc nooit leest. Schrijf het volledige commando uit, of geef het volledige pad op naar een binary die alleen in uw interactieve PATH staat.
  • Standard error is het waard om op te vangen. Plaats 2>&1 binnen de aanhalingstekens wanneer u wilt dat foutmeldingen in het frame worden getoond in plaats van eroverheen verspreid.

Wanneer het gebruik van aanhalingstekens lastig wordt, voert -x (--exec) het commando direct uit in plaats van via sh -c. Argumenten met spaties worden eenvoudiger, en pipes en globs werken helemaal niet meer, omdat er geen shell meer is om ze te interpreteren.

Rechten volgen dezelfde logica, aangezien watch een gewoon proces is. watch 'sudo ss -tulpn' stuit op een wachtwoordprompt die u niet kunt zien of waarin u niet kunt typen. Voer in plaats daarvan sudo watch 'ss -tulpn' uit, en onthoud dat de volledige loop dan als root draait totdat u op Ctrl+C drukt.

Vier zaken om in de gaten te houden op een VPS

Een schijf die volloopt

watch -n 30 -d 'df -h / /var'

df vraagt de kernel om gegevens die al in het geheugen staan, waardoor het goedkoop genoeg is om eindeloos te herhalen. du -sh /var/log is dat niet, omdat het bij elke cyclus elk bestand in de boomstructuur doorloopt. Onder watch leest het continu de schijf en vertraagt het de machine die u probeert te diagnosticeren. Voer du eenmalig uit, of gebruik ncdu, en laat daarna df onder watch draaien om te zien of het getal nog steeds oploopt.

Een container die blijft herstarten

cd /srv/myapp
watch -n 5 -d 'docker compose ps'

De statuskolom toont hoe lang elke container actief is. Een container in een crashloop blijft terugkeren naar "Up 2 seconds", en -d maakt dat in één oogopslag duidelijk. Wijzig eerst de directory, omdat watch de werkdirectory erft van de shell die het startte en docker compose zijn projectdirectory nodig heeft. watch vertelt u dat er een herstart plaatsvindt. docker compose logs -f web vertelt u waarom. Zodra u de oorzaak weet, verwerkt u het antwoord in een Compose healthcheck die de container voor u herstart, zodat niemand naar een scherm hoeft te staren.

Een certificaatvernieuwing die binnenkomt

sudo -i
watch -n 60 -g 'openssl x509 -noout -enddate -in /etc/letsencrypt/live/example.com/fullchain.pem'

Het commando print één regel, notAfter=Nov 7 09:14:22 2026 GMT, en niets anders, dus -g wordt precies geactiveerd wanneer het bestand wordt vervangen door een vernieuwd exemplaar. De bestanden onder /etc/letsencrypt/live zijn alleen leesbaar door root, daarom draait dit in een root-shell. Let op: dit controleert het certificaat op de schijf. Een draaiende webserver houdt het oude certificaat in het geheugen totdat deze herlaadt, dus controleer wat er daadwerkelijk wordt geserveerd met echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate, en zet dat commando niet op een interval van twee seconden tegen een publieke host. De vernieuwing zelf hoort thuis in een systemd service en timer, en systemctl list-timers toont wanneer deze de volgende keer zal draaien.

Een wachtrij die leegloopt

watch -n 15 'postqueue -p | tail -n 1'

Dat print een samenvattingsregel zoals -- 24 Kbytes in 6 Requests., of Mail queue is empty zodra het klaar is. Dezelfde vorm werkt voor elke wachtrij die u kunt tellen: watch -n 5 'find /srv/queue/incoming -type f | wc -l'.

Hier bereikt watch zijn limiet. Het vergelijkt het huidige frame met het vorige, en het kan geen voorwaarde testen, dus het kan u nooit vertellen "de teller bereikte nul". Een eenvoudige shell-loop kan dat wel, door command substitution te gebruiken om de telling bij elke pass vast te leggen:

until [ "$(find /srv/queue/incoming -type f | wc -l)" -eq 0 ]; do sleep 5; done; echo 'queue drained'

Wanneer het watch-commando niet het juiste gereedschap is

watch voert uw commando telkens opnieuw uit zonder geheugen van de vorige uitvoering en zonder inzicht in wat het commando doet. Dit is prima voor df. In vier situaties is het echter onjuist.

  • Logs. watch ververst een vast kader, waardoor regels die tussen twee cycli verschijnen en weer verdwijnen, verloren gaan. Gebruik journalctl -fu nginx of tail -f, die nieuwe regels streamen zodra ze worden geschreven.
  • Kostbare commando's. du -sh / of een query op een drukke database wordt een permanente achtergrondbelasting bij elk interval, omdat watch het proces telkens opnieuw start.
  • Acties met bijwerkingen. Een commando dat schrijft, verstuurt, herstart of installeert, zal dit bij elke cyclus opnieuw doen. Een curl naar een API elke twee seconden resulteert in 43.200 verzoeken per dag; dit is de manier waarop een gratis API-sleutel wordt opgeschort.
  • Langdurige controles. watch draait in uw terminal en stopt zodra uw sessie eindigt. Het waarschuwt niemand en bewaart geen geschiedenis nadat u de laptop afsluit. Hiervoor wilt u een echte statusmonitor zoals Uptime Kuma, of een geplande controle die op de server blijft draaien.

De eerlijke grens is tijd. watch is bedoeld voor de tien minuten die u besteedt aan het wachten tot er iets specifieks gebeurt. Alles wat morgen nog steeds gecontroleerd moet worden, hoort thuis in een geplande timer of een echte monitor.

Voer watch uit binnen tmux tijdens een SSH-sessie

Via SSH is de duurzaamheid van watch afhankelijk van de verbinding. Wanneer de verbinding wegvalt, ontvangt uw shell een SIGHUP en wordt watch beëindigd. tmux lost dit op, en dat maakt watch pas echt nuttig op een externe server.

tmux new -As ops
watch -n 30 -d 'df -h /'

Druk op Ctrl+b en vervolgens op d om los te koppelen (detach). De lus blijft op de server draaien. Maak later opnieuw verbinding met tmux attach -t ops en het venster wordt nog steeds bijgewerkt, wat te zien is aan de klok in de koptekst. Splits het venster om watch aan de ene kant en journalctl -f aan de andere kant te houden; dit is precies het idee achter een op tmux gebaseerde terminal-werkplek. Wanneer dezelfde vraag op meerdere servers tegelijk van toepassing is, is dat een taak voor een tool die is gebouwd voor het beheren van vele Linux-servers in plaats van een muur vol watch-vensters.

De hier getoonde schermen dienen als illustratie. De kolomindeling en versiestrings verschillen per distributie en procps-ng-release. Lees daarom man watch op uw eigen machine om te zien welke vlaggen uw build daadwerkelijk ondersteunt.

FAQ

Waarom negeert watch de pipe in watch mycmd | grep foo?

Uw shell splitst de regel bij de pipe voordat watch wordt gestart. Hierdoor wordt de schermweergave van watch zelf naar grep gepiped en wordt de output van het commando nooit gefilterd. Plaats de gehele pipeline tussen aanhalingstekens: watch 'mycmd | grep foo'. watch geeft dit enkele argument door aan sh -c, dat de pipeline per cyclus één keer uitvoert. Dezelfde regel geldt voor globs en command substitution.

Welk interval moet ik gebruiken met watch?

Stem het interval af op de snelheid waarmee de waarde verandert en de belasting van het commando. Een halve seconde is geschikt voor snelle tellers; 0.1 seconde is het kleinste interval dat watch accepteert. Dertig tot zestig seconden is geschikt voor schijfgebruik en certificaten. De uitvoeringstijd van het commando wordt bij de pauze opgeteld, tenzij u -p gebruikt. Een traag commando onder -n 1 wordt daardoor direct achter elkaar uitgevoerd zonder pauze.

Kan watch een logbestand volgen?

Nee. watch ververst het scherm per frame en houdt geen geschiedenis bij. Elke regel die tussen twee cycli verschijnt en weer verdwijnt, is definitief verloren. journalctl -fu <unit> en tail -f streamen nieuwe regels zodra ze binnenkomen; dit is de juiste methode voor logs. Gebruik watch voor waarden met een actuele status, zoals een schijfpercentage of de lengte van een wachtrij.

Hoe laat ik watch stoppen wanneer de gebeurtenis waar ik op wacht plaatsvindt?

Gebruik -g (--chgexit) en geef een commando op waarvan de output identiek blijft totdat de gebeurtenis optreedt. Output die een klok of een PID bevat, verandert bij de eerste verversing en zorgt voor een directe exit. Daarom werkt systemctl is-active myapp waar systemctl status myapp faalt. Voor een echte voorwaarde, zoals een teller die nul bereikt, gebruikt u een shell until-loop, omdat watch alleen kan detecteren of de output is veranderd.

Waarom geeft watch de melding command not found voor iets dat wel werkt in mijn shell?

watch geeft het commando door aan sh -c. Deze shell leest .bashrc niet, waardoor uw aliassen en shell-functies daar niet bestaan. De melding is doorgaans sh: 1: ll: not found. Schrijf het volledige commando uit of gebruik het absolute pad voor een binary die zich alleen in uw interactieve PATH bevindt.