Wie kann ich die dmesg-Ausgabe sehen, wenn sie sich ändert?


Antworten:


178

Relativ neuere dmesgVersionen bieten eine Follow-Option ( -w, --follow), die analog zu funktioniert tail -f.

Verwenden Sie dazu einfach den folgenden Befehl:

$ dmesg -wH

( -H, --humanermöglicht benutzerfreundliche Funktionen wie Farben, relative Zeit)

Diese Optionen sind beispielsweise in Fedora 19 verfügbar.


2
Nizza zu finden! Gentoo grok nicht, -Haber sonst genau richtig
unperson325680

Die User Space Tools müssen Version 2.22+ sein. Ubuntu-Benutzer müssen auf die Version 14.10 "utopic" warten
Daniel Alder

1
Ubuntu grok -w nicht - Uhr (unten) verwenden müssen
Brent Faust

2
Wow eine Sysadmin-Antwort, die --descriptively-named-Flags anstelle von kryptischen Einzelzeichen-Flags verwendet. BRAVO, SIR. BRAVO.
Allyourcode

1
-wsollte in jeder Ubuntu-Version ab Utopic (14.10) funktionieren. ( launchpad.net/ubuntu/+source/util-linux/+publishinghistory deutet darauf hin, dass frühe Utopic-Pakete 2.20 waren, aber 2.25 erreichten, als sie veröffentlicht wurden.)
mwfearnley

54

Sie können den watchBefehl verwenden, der genau für solche Dinge vorgesehen ist

watch -n 0.1 "dmesg | tail -n $((LINES-6))"

Das $((LINES-6))Teil sollte gut in Ihr Terminal passen.


2
Wenn Sie einfache Anführungszeichen anstelle von doppelten Anführungszeichen verwenden (oder das Dollarzeichen umgehen), erhalten Sie für jeden Aufruf einen neuen Wert von $ LINES, der angepasst wird, wenn Sie die Terminalgröße ändern.
P Daddy

Einfache Anführungszeichen verhindern die variable Expansion. Außerdem wird die Variable in diesem Beispiel nur einmal erweitert - beim Aufruf von watch. So wird es nicht wirklich zwischen Aufrufen von ändern dmesg. Man müsste einen Wrapper verwenden, der den Terminalstatus abfragt.
Peterph

2
Das ist der springende Punkt. Die einfachen Anführungszeichen verbieten die Variablenerweiterung, wenn die Shell die Argumente an übergibt watch. Deshalb führt watch den Befehl mit dem darin enthaltenen Variablenausdruck aus, der von der aufgerufenen Shell erweitert wird. Jedes Mal. Probieren Sie es aus, es funktioniert.
P Daddy

Hmm, Sie haben Recht - ich nehme an , dass using watchverwendet wird popen(), was bedeutet, dass eine andere Shell erzeugt wird und die Umgebungsvariable dann von ihr geliefert wird (und somit bei jedem Ausführungslauf aktualisiert wird). Schöner Fund.
Peterph

12

Sie können die Ausgabe von nicht wirklich dmesgdirekt überwachen .

Die Wahrscheinlichkeit ist jedoch groß, dass Ihr Modul nicht direkt in den Ringpuffer von dmesg druckt, sondern stattdessen die Kernel-Protokollierungsfunktionen verwendet (die dann von angezeigt werden dmesg). Wenn Sie syslogüber vernünftige (z. B. Standard-) Einstellungen verfügen, werden diese Meldungen höchstwahrscheinlich auch in der kern.logProtokolldatei angezeigt.

so kannst du etwas machen wie:

 tail -f /var/log/kern.log

/var/log/kern.logist ziemlich Linux-spezifisch. Für OpenBSD (und möglicherweise für andere) wird das dmesg-Zeug in / var / log / messages angemeldet. Zugegeben, es gibt noch ein paar andere Sachen.
Kurtm

2
tail -f /var/log/{messages,kernel,dmesg,syslog}via superuser: ist-es-möglich-die-ausgabe-von-dmesg-zu-beenden
hier

9

Mit erhalten Sie dmesgLogmeldungen des Kernels.

Der Kernel selbst meldet sich in einem Ringpuffer an, also nur im Speicher. Jetzt dmesgwird nur noch der Inhalt dieses Ringpuffers ausgegeben. In dmesg -cdiesem Fall wird auch der Ringpuffer anschließend gelöscht.

Daher könnte man so while true; do dmesg -c; sleep 1; doneetwas wie das Äquivalent eines nicht funktionierenden haben dmesg|tail. Dies löscht jedoch den Ringpuffer und benötigt daher Root-Potenzen.

Der andere Weg ist die Datei /proc/kmsg, die einen Blick auf den Ringpuffer erlaubt. Sie können dies tun tail -f /proc/kmsg, dies ist jedoch nur für einen Prozess zulässig, und dies ist normalerweise Ihr Protokollierungsdämon. - Es ist Aufgabe, die Nachrichten zu lesen und in echte Dateien zu schreiben (normalerweise in / var / log), in denen sie gelesen werden können. Es kann so konfiguriert werden, dass alle Nachrichten in eine einzelne Datei oder verschiedene Teile in verschiedene Dateien ausgegeben werden. (Die Konfiguration hängt jedoch vom Protokollierungsdämon Ihres Systems ab.)

Sehen Sie sich daher an, /var/logob es eine Datei gibt, die Ihren Anforderungen entspricht, und konfigurieren Sie Ihren Protokollierungsdämon ansonsten.


//, Auf dem CEntOS 6-System, das ich verwende, erzeugt das Tailing und das Anzeigen von / proc / kmsg keine Ausgabe. [~] $ sudo Schwanz -f / proc / kmsg ♥% [~] $ sudo Katze / proc / kmsg ♥% [~] $
Nathan Basanese

8

Wenn Sie ein eingebettetes System verwenden, verfügt die auf Systemen wie OpenWRT übliche Busybox über eine sehr eingeschränkte Funktionalität und es werden nur 2-3 Flags unterstützt.

Wenn Sie eine schnelle und unkonventionelle Methode zum kontinuierlichen Drucken von dmesg-Ausgaben auf dem Bildschirm bei sich ändernden Ereignissen wünschen, funktioniert eine einfache Bash-Schleife einwandfrei. Es ist nicht ideal, aber wie ich schon sagte, der BusyBox dmesg fehlen viele Funktionen. Folgendes hat den gleichen Effekt, wenn es in die Befehlszeile eingegeben wird:

$ while true; do dmesg -c ; sleep 1 ; done

Sie können die Schleife mit Strg-C verlassen, um zu verhindern, dass die CPU unnötig geschlagen wird. Das Flag -c löscht den Puffer bei jedem Aufruf, damit nicht jede Sekunde eine wiederholte Ausgabe angezeigt wird.


1
Wirklich nützlich zum Debuggen von Android.
val

5

Auf Systemen, die systemdSie verwenden, können Sie auch:

# journalctl -kf

1
Ubuntu 14.10: ➜ ~ journalctl -kf Es wurden keine Journaldateien gefunden.
Nathan Basanese

0

Verwenden Sie diese 2 Befehle von verschiedenen Terminals:

  1. while true; do dmesg -c >> test.txt;sleep 1; done
  2. tail -f test.txt

Es wird ein ähnliches Ergebnis erzielen.


//, Dies weist dmesg grundsätzlich an, die Ausgabe an test.txt anzuhängen, oder? Und der zweite Befehl überwacht nur die Datei test.txt?
Nathan Basanese

Danke .. ja .. der 2. Befehl überwacht die Änderungen an dmesg. cat / proc / kmsg kann eine ähnliche Ausgabe erzielen, speichert die Protokolle jedoch nicht in einer Datei.
K_K
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.