Linux watch richtig nutzen: Intervall, Diff und Pipes
watch wiederholt Befehle standardmäßig alle zwei Sekunden. Erfahren Sie, wie Sie Intervalle wählen, Änderungen hervorheben, bei Änderungen beenden und Pipes korrekt quoten.
Was der Befehl watch macht
Der Befehl watch führt einen anderen Befehl in einem festen Intervall erneut aus und zeichnet dessen Ausgabe an derselben Stelle auf dem Bildschirm neu. Das Standardintervall beträgt zwei Sekunden. Verwenden Sie ihn, wenn Sie darauf warten, dass sich ein Wert verändert: wenn ein Datenträger vollläuft, ein Container seinen stabilen Zustand erreicht, eine Zertifikatserneuerung abgeschlossen wird oder eine Warteschlange leerläuft.
watch stammt aus procps-ng und ist auf einem frisch installierten Ubuntu- oder Debian-VPS bereits als Teil des Pakets procps installiert. Prüfen Sie Ihre Version, bevor Sie den unten gezeigten Optionen vertrauen, da zwei der nützlichen Optionen erst seit Kurzem verfügbar sind.
watch --versionUnter Ubuntu 24.04 wird eine Zeile wie watch from procps-ng 4.0.4 ausgegeben. Nun ein einfachstes nützliches Beispiel.
watch df -h /Der Bildschirm wird gelöscht und zeigt eine Kopfzeile, eine leere Zeile und anschließend die Ausgabe von df -h /:
Every 2.0s: df -h / server1: Sun Aug 9 10:21:44 2026Links stehen das Intervall und der genaue Befehl, den watch ausführt. Rechts stehen der Hostname und die aktuelle Uhrzeit. Die Uhr ist dabei besonders nützlich, weil sie bestätigt, dass der Bildschirm weiterhin aktualisiert wird, auch wenn sich die darunter angezeigten Werte nicht verändern. Drücken Sie Ctrl+C, um den Befehl zu beenden.
watch zeichnet einen einzelnen Frame, der in das Terminal passt. Lange Zeilen werden umgebrochen, -w kürzt sie stattdessen, und alles hinter der letzten Zeile wird überhaupt nicht gezeichnet. Innerhalb des Frames gibt es keinen Scrollback, weil jeder Durchlauf den vorherigen überschreibt. Diese eine Tatsache bestimmt, wofür watch in den meisten Fällen geeignet ist.
Wie oft soll watch den Befehl erneut ausführen?
Zwei Sekunden sind nur der Standardwert. Wählen Sie das Intervall danach aus, wie schnell sich der Wert ändert und wie viel Zeit ein Durchlauf benötigt.
-n 0.5für Zähler, die sich ständig ändern, beispielsweisess -soder die Byte-Anzahl einer Schnittstelle. Das kleinste von watch akzeptierte Intervall beträgt 0.1 Sekunden.-n 30oder-n 60für Datenträger und Zertifikate. Ein Dateisystem, das sich innerhalb eines Tages füllt, muss nicht dreißigmal pro Minute aktualisiert werden.
watch führt den Befehl aus, wartet auf dessen Abschluss und wartet erst danach die angegebene Zeit. Die Laufzeit verlängert also den Abstand. Ein Befehl, der unter -n 2 acht Sekunden benötigt, liefert dadurch alle zehn Sekunden eine Ausgabe und lastet die Maschine während der gesamten Zeit aus. Mit -p (--precise) versucht watch stattdessen, einen Durchlauf alle angegebenen Sekunden zu starten. Gemessen wird dabei vom Start eines Durchlaufs bis zum Start des nächsten.
Wenn Sie dauerhaft einen anderen Standardwert verwenden möchten, exportieren Sie WATCH_INTERVAL in Ihrem Shell-Profil. Ein explizit angegebenes -n hat weiterhin Vorrang. Führen Sie watch --help aus, um zu prüfen, ob Ihr Build diese Variable auswertet.
Mit -d Änderungen hervorheben
Eine Wand aus identischem Text zu lesen und das eine verschobene Feld zu finden, ist mühsam. -d (--differences) übernimmt diese Aufgabe.
watch -n 30 -d 'df -h / /var'Zeichen, die sich gegenüber dem vorherigen Frame unterscheiden, werden invers dargestellt. Dadurch leuchtet die Zelle Use% auf, sobald sie verschoben wird, während alles andere unverändert bleibt. Wenn /var kein separates Dateisystem ist, wird das Root-Dateisystem zweimal aufgelistet. So lässt sich schnell erkennen, wie das System partitioniert ist.
Der Vergleich erfolgt positionsbezogen. Das bedeutet, dass watch die Zeilen des neuen Frames Zeichen für Zeichen mit dem vorherigen Frame vergleicht. Bei Ausgaben, deren Spaltenbreite sich ändert, wird daher fast die gesamte Ausgabe hervorgehoben. Verwenden Sie bevorzugt Befehle mit einem stabilen Layout. Aktuelle Versionen von procps-ng akzeptieren außerdem watch --differences=permanent. Damit bleibt jede Position hervorgehoben, die jemals geändert wurde, und nicht nur die letzte Änderung. Bestätigen Sie dies mit watch --help, bevor Sie sich darauf verlassen.
Wie kann ich watch beenden, sobald sich die Ausgabe ändert?
-g (--chgexit) beendet watch beim ersten Durchlauf, in dem sich die Ausgabe gegenüber dem vorherigen Durchlauf unterscheidet. Die Eingabeaufforderung wird wieder angezeigt. Sie können daher in derselben Zeile etwas dahinter eingeben.
watch -n 10 -g 'systemctl is-active myapp' ; echo 'state changed'Dieses Flag macht aus watch ein Werkzeug nach dem Muster „Melde mir, wenn das Deployment abgeschlossen ist“. Dabei gibt es eine Falle, die fast jeden betrifft: Der Vergleich umfasst die gesamte Ausgabe. Eine Uhrzeit oder eine PID (Prozess-ID) ändert sich bereits beim ersten Aktualisieren. Dadurch beendet sich watch sofort. systemctl status myapp gibt die verstrichene Zeit und die Speichernutzung aus. -g darauf anzuwenden, ist daher nutzlos. Beschränken Sie den Befehl auf die einzelne stabile Information, auf die Sie warten. Genau das liefert systemctl is-active.
Neuere procps-ng-Versionen unterstützen den umgekehrten Test --equexit <cycles>. Damit wird watch beendet, sobald die Ausgabe über die angegebene Anzahl von Durchläufen unverändert geblieben ist. Damit können Sie prüfen, ob „keine Änderungen mehr auftreten“. Prüfen Sie watch --help, da ältere Builds diese Option nicht enthalten.
Warum ignoriert watch meine Pipe und mein Glob?
Diesen Fehler macht fast jeder einmal. Die Ursache liegt in Ihrer Shell und nicht in watch.
watch docker compose ps | grep webIhre interaktive Shell liest die gesamte Zeile, bevor etwas ausgeführt wird, und teilt sie an der Pipe auf. Sie startet watch docker compose ps und verbindet die eigene Bildschirmausgabe von watch mit grep. watch schreibt dadurch nicht mehr in ein Terminal. Die Anzeige ist fehlerhaft oder leer, und grep filtert die Neuzeichnungsausgabe statt einer Containerliste.
Setzen Sie die gesamte Pipeline in Anführungszeichen, damit sie als ein Argument übergeben wird.
watch 'docker compose ps | grep web'watch übergibt diese Zeichenfolge an sh -c. Diese Shell führt die Pipeline in jedem Durchlauf einmal aus. Für Globs gilt dieselbe Regel, allerdings ist das Problem weniger offensichtlich.
watch ls -l /var/log/*.log
watch 'ls -l /var/log/*.log'In der ersten Zeile löst Ihre Shell das Glob einmal auf, sobald Sie die Eingabetaste drücken. watch führt anschließend eine unveränderte Liste von Dateinamen erneut aus. Eine Logdatei, die eine Minute später erstellt wird, erscheint daher nicht. In der zweiten Zeile übergeben Sie das Glob an watch. watch löst es in sh bei jedem Durchlauf auf. Neue Dateien werden dadurch automatisch angezeigt.
Anführungszeichen bestimmen auch, wann eine Variable oder eine Befehlssubstitution ausgewertet wird. watch "echo $(date)" führt date einmal in Ihrer Shell aus und gibt diese unveränderte Zeichenfolge anschließend dauerhaft aus. watch 'echo $(date)' führt date in jedem Durchlauf aus. Einfache Anführungszeichen bedeuten später. Doppelte Anführungszeichen bedeuten jetzt.
Daraus ergeben sich zwei weitere Folgen von sh -c:
- Aliase und Shell-Funktionen sind darin nicht verfügbar.
watch llschlägt mitsh: 1: ll: not foundfehl, weilsh -cIhre.bashrcnicht liest. Schreiben Sie den echten Befehl aus oder geben Sie den vollständigen Pfad zu einer Binärdatei an, die sich nur in Ihrer interaktivenPATHbefindet. - Standardfehler sollten erfasst werden. Setzen Sie
2>&1in die Anführungszeichen, wenn der Fehlertext innerhalb des Anzeigerahmens und nicht darüber verteilt erscheinen soll.
Wenn die Verwendung von Anführungszeichen zu kompliziert wird, führt -x (--exec) den Befehl direkt statt über sh -c aus. Argumente mit Leerzeichen lassen sich dadurch einfacher übergeben. Pipes und Globs funktionieren dann jedoch überhaupt nicht mehr, weil keine Shell sie interpretiert.
Für Berechtigungen gilt dieselbe Logik, da watch ein gewöhnlicher Prozess ist. watch 'sudo ss -tulpn' erreicht eine Passwortabfrage, die Sie weder sehen noch bedienen können. Führen Sie stattdessen sudo watch 'ss -tulpn' aus. Beachten Sie, dass die gesamte Schleife dann als root läuft, bis Sie Ctrl+C drücken.
Vier Dinge, die Sie auf einem VPS überwachen sollten
Ein Datenträger, der vollläuft
watch -n 30 -d 'df -h / /var'df fragt den Kernel nach Werten, die bereits vorliegen. Deshalb kann der Befehl problemlos dauerhaft wiederholt werden. Das gilt für du -sh /var/log nicht, weil der Befehl bei jedem Durchlauf jede Datei im Verzeichnisbaum durchsucht. Unter watch wird der Datenträger kontinuierlich gelesen und der Rechner verlangsamt, den Sie gerade diagnostizieren. Führen Sie du einmal aus oder verwenden Sie ncdu. Lassen Sie anschließend df von watch überwachen, um zu erkennen, ob der Wert weiter steigt.
Ein Container, der ständig neu startet
cd /srv/myapp
watch -n 5 -d 'docker compose ps'Die Statusspalte zeigt, wie lange jeder Container bereits läuft. Ein Container in einer Absturzschleife wird immer wieder auf „Up 2 seconds“ zurückgesetzt. -d macht das auf einen Blick sichtbar. Wechseln Sie zuerst in das richtige Verzeichnis. watch übernimmt das Arbeitsverzeichnis der Shell, aus der es gestartet wurde, und docker compose benötigt das Projektverzeichnis. watch zeigt, dass ein Neustart stattfindet. docker compose logs -f web zeigt den Grund. Sobald Sie die Ursache kennen, hinterlegen Sie die Lösung als einen Compose-Healthcheck, der den Container automatisch neu startet, damit niemand vor dem Bildschirm sitzen und ihn beobachten muss.
Eine Zertifikatserneuerung, die wirksam wird
sudo -i
watch -n 60 -g 'openssl x509 -noout -enddate -in /etc/letsencrypt/live/example.com/fullchain.pem'Der Befehl gibt eine Zeile, notAfter=Nov 7 09:14:22 2026 GMT, und sonst nichts aus. Daher wird -g genau dann ausgelöst, wenn die Datei durch eine erneuerte Datei ersetzt wird. Die Dateien unter /etc/letsencrypt/live sind nur für root lesbar. Deshalb wird dieser Befehl in einer root-Shell ausgeführt. Beachten Sie, dass der Befehl das Zertifikat auf dem Datenträger überwacht. Ein laufender Webserver behält das alte Zertifikat im Speicher, bis er neu geladen wird. Prüfen Sie daher mit echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate, welches Zertifikat tatsächlich ausgeliefert wird. Führen Sie diesen Befehl nicht in einem Intervall von zwei Sekunden gegen einen öffentlichen Host aus. Die Erneuerung selbst gehört zu einem systemd-Service und Timer. systemctl list-timers zeigt, wann der nächste Lauf stattfindet.
Eine Warteschlange, die sich leert
watch -n 15 'postqueue -p | tail -n 1'Der Befehl gibt eine Zusammenfassungszeile wie -- 24 Kbytes in 6 Requests. aus oder Mail queue is empty, sobald die Verarbeitung abgeschlossen ist. Das gleiche Muster funktioniert für jede Warteschlange, deren Einträge Sie zählen können: watch -n 5 'find /srv/queue/incoming -type f | wc -l'.
Hier stößt watch an seine Grenzen. Der Befehl vergleicht einen Durchlauf mit dem vorherigen und kann keine Bedingung prüfen. Deshalb kann er niemals feststellen, dass „der Zähler null erreicht hat“. Eine einfache Shell-Schleife kann das. Sie verwendet Command Substitution, um den Zähler bei jedem Durchlauf zu übernehmen:
until [ "$(find /srv/queue/incoming -type f | wc -l)" -eq 0 ]; do sleep 5; done; echo 'queue drained'Wenn der Befehl watch das falsche Werkzeug ist
watch führt Ihren Befehl erneut aus, ohne sich an den vorherigen Durchlauf zu erinnern oder zu wissen, was dieser Befehl tut. Das ist für df in Ordnung. In vier Situationen ist watch jedoch ungeeignet.
- Logs. watch zeichnet einen festen Bildschirmausschnitt neu. Zeilen, die zwischen zwei Durchläufen erscheinen und aus dem Ausschnitt herausscrollen, gehen verloren. Verwenden Sie
journalctl -fu nginxodertail -f. Diese Befehle geben neue Zeilen aus, sobald sie geschrieben werden. - Aufwendige Befehle.
du -sh /oder eine Abfrage an eine ausgelastete Datenbank erzeugt bei jedem Intervall dauerhaft zusätzliche Last, weil watch den Befehl immer wieder startet. - Alles mit Seiteneffekten. Ein Befehl, der schreibt, Anfragen sendet, Dienste neu startet oder Software installiert, führt diese Aktion bei jedem Durchlauf erneut aus. Ein
curlan eine API alle zwei Sekunden entspricht 43,200 Anfragen pro Tag. Dadurch kann ein kostenloser API-Schlüssel gesperrt werden. - Lang laufende Prüfungen. watch läuft in Ihrem Terminal und endet mit Ihrer Sitzung. Der Befehl benachrichtigt niemanden und speichert nach dem Schließen des Laptops keine Historie. Verwenden Sie dafür einen echten Statusmonitor wie Uptime Kuma oder eine geplante Prüfung, die auf dem Server ausgeführt wird.
Die sinnvolle Grenze ist die Zeit. watch eignet sich für die zehn Minuten, in denen Sie auf ein bestimmtes Ereignis warten. Alles, was auch morgen noch geprüft werden soll, gehört in einen geplanten Timer oder einen echten Monitor.
watch innerhalb von tmux über SSH verwenden
Über SSH ist watch nur so robust wie die Verbindung. Wenn die Verbindung abbricht, empfängt Ihre Shell SIGHUP und beendet watch ebenfalls. tmux verhindert das. Dadurch wird watch auf einem entfernten System wirklich nützlich.
tmux new -As ops
watch -n 30 -d 'df -h /'Drücken Sie Ctrl+b und anschließend d, um die Sitzung zu trennen. Die Schleife läuft auf dem Server weiter. Stellen Sie später mit tmux attach -t ops die Verbindung wieder her. Das Bild wird weiterhin aktualisiert. Die Uhr in der Kopfzeile bestätigt dies. Teilen Sie das Fenster, können Sie watch auf einer Seite und journalctl -f auf der anderen Seite ausführen. Genau darum geht es bei einer auf tmux basierenden Terminal-Arbeitsumgebung. Wenn dieselbe Frage gleichzeitig mehrere Systeme betrifft, ist ein Werkzeug zur Verwaltung vieler Linux-Server geeigneter als zahlreiche watch-Fenster.
Die hier gezeigten Ausgaben dienen nur als Beispiele. Das Spaltenlayout und die Versionszeichenfolgen unterscheiden sich je nach Distribution und procps-ng-Version. Lesen Sie daher auf Ihrem eigenen System die Ausgabe von man watch, um die in Ihrem Build tatsächlich verfügbaren Flags zu ermitteln.
FAQ
Warum ignoriert watch die Pipe in watch mycmd | grep foo?
Ihre Shell teilt die Zeile an der Pipe, bevor watch überhaupt startet. Dadurch wird die Bildschirmausgabe von watch selbst an grep weitergeleitet, und die Ausgabe des Befehls wird nie gefiltert. Setzen Sie stattdessen die gesamte Pipeline in Anführungszeichen: watch 'mycmd | grep foo'. watch übergibt dieses einzelne Argument an sh -c, das die Pipeline bei jedem Zyklus einmal ausführt. Die gleiche Regel gilt für Globs und Command Substitution.
Welches Intervall sollte ich mit watch verwenden?
Richten Sie das Intervall danach, wie schnell sich der Wert ändert und wie aufwendig eine Ausführung ist. Für schnelle Zähler sind 0.5 Sekunden geeignet. 0.1 Sekunden ist das kleinste von watch akzeptierte Intervall. Für Datenträger und Zertifikate sind 30 bis 60 Sekunden geeignet. Die Laufzeit des Befehls kommt zum Abstand hinzu, sofern Sie nicht -p übergeben. Ein langsamer Befehl unter -n 1 wird dadurch direkt hintereinander ausgeführt und pausiert nie.
Kann watch einer Logdatei folgen?
Nein. watch zeichnet einen Frame neu und speichert keinen Verlauf. Jede Zeile, die zwischen zwei Zyklen erscheint und aus dem sichtbaren Bereich scrollt, ist endgültig verloren. journalctl -fu <unit> und tail -f streamen neue Zeilen, sobald sie eintreffen. Das ist für Logs erforderlich. Verwenden Sie watch für Werte mit einem aktuellen Zustand, etwa einen Datenträgerprozentsatz oder die Länge einer Warteschlange.
Wie kann ich watch beenden, sobald das erwartete Ereignis eintritt?
Verwenden Sie -g (--chgexit) und übergeben Sie einen Befehl, dessen Ausgabe bis zu diesem Ereignis unverändert bleibt. Eine Ausgabe mit einer Uhrzeit oder einer PID ändert sich bereits bei der ersten Aktualisierung und beendet den Befehl sofort. Daher funktioniert systemctl is-active myapp, während systemctl status myapp nicht funktioniert. Für eine echte Bedingung, etwa wenn ein Zähler den Wert null erreicht, verwenden Sie eine until-Schleife in der Shell. watch kann nur erkennen, dass sich die Ausgabe geändert hat.
Warum meldet watch für etwas, das in meiner Shell funktioniert, command not found?
watch übergibt den Befehl an sh -c. Diese Shell liest .bashrc nicht ein. Daher sind Ihre Aliase und Shell-Funktionen dort nicht vorhanden. Die Meldung lautet meistens sh: 1: ll: not found. Schreiben Sie den vollständigen Befehl aus oder verwenden Sie den vollständigen Pfad für eine Binärdatei, die nur in Ihrer interaktiven PATH vorhanden ist.