Ich schreibe einen Gerätetreiber, der eine Fehlermeldung in die Ringpuffer- Dmesg-Ausgabe druckt. Ich möchte die Ausgabe von sehen, dmesg
wie es sich ändert.
Wie kann ich das machen?
Ich schreibe einen Gerätetreiber, der eine Fehlermeldung in die Ringpuffer- Dmesg-Ausgabe druckt. Ich möchte die Ausgabe von sehen, dmesg
wie es sich ändert.
Wie kann ich das machen?
Antworten:
Relativ neuere dmesg
Versionen bieten eine Follow-Option ( -w
, --follow
), die analog zu funktioniert tail -f
.
Verwenden Sie dazu einfach den folgenden Befehl:
$ dmesg -wH
( -H
, --human
ermöglicht benutzerfreundliche Funktionen wie Farben, relative Zeit)
Diese Optionen sind beispielsweise in Fedora 19 verfügbar.
-H
aber sonst genau richtig
-w
sollte 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.)
Sie können den watch
Befehl 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.
watch
. So wird es nicht wirklich zwischen Aufrufen von ändern dmesg
. Man müsste einen Wrapper verwenden, der den Terminalstatus abfragt.
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.
watch
verwendet 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.
Sie können die Ausgabe von nicht wirklich dmesg
direkt ü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.log
Protokolldatei angezeigt.
so kannst du etwas machen wie:
tail -f /var/log/kern.log
/var/log/kern.log
ist 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.
tail -f /var/log/{messages,kernel,dmesg,syslog}
via superuser: ist-es-möglich-die-ausgabe-von-dmesg-zu-beenden
Mit erhalten Sie dmesg
Logmeldungen des Kernels.
Der Kernel selbst meldet sich in einem Ringpuffer an, also nur im Speicher. Jetzt dmesg
wird nur noch der Inhalt dieses Ringpuffers ausgegeben. In dmesg -c
diesem Fall wird auch der Ringpuffer anschließend gelöscht.
Daher könnte man so while true; do dmesg -c; sleep 1; done
etwas 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/log
ob es eine Datei gibt, die Ihren Anforderungen entspricht, und konfigurieren Sie Ihren Protokollierungsdämon ansonsten.
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.
Auf Systemen, die systemd
Sie verwenden, können Sie auch:
# journalctl -kf
Verwenden Sie diese 2 Befehle von verschiedenen Terminals:
while true; do dmesg -c >> test.txt;sleep 1; done
tail -f test.txt
Es wird ein ähnliches Ergebnis erzielen.