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

141

Ich schreibe einen Gerätetreiber, der eine Fehlermeldung in die Ringpuffer- Dmesg-Ausgabe druckt. Ich möchte die Ausgabe von sehen, dmesgwie es sich ändert.

Wie kann ich das machen?

Milad Khajavi
quelle

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.

maxschlepzig
quelle
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.

peterph
quelle
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
umläute
quelle
/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.

michas
quelle
//, 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.

user241342
quelle
1
Wirklich nützlich zum Debuggen von Android.
val
5

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

# journalctl -kf
Maxime
quelle
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.

K_K
quelle
//, 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