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?
linux
command-line
logs
dmesg
Milad Khajavi
quelle
quelle
Antworten:
Relativ neuere
dmesg
Versionen bieten eine Follow-Option (-w
,--follow
), die analog zu funktionierttail -f
.Verwenden Sie dazu einfach den folgenden Befehl:
(
-H
,--human
ermöglicht benutzerfreundliche Funktionen wie Farben, relative Zeit)Diese Optionen sind beispielsweise in Fedora 19 verfügbar.
quelle
-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 istDas
$((LINES-6))
Teil sollte gut in Ihr Terminal passen.quelle
watch
. So wird es nicht wirklich zwischen Aufrufen von änderndmesg
. 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 wirdpopen()
, 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 Siesyslog
über vernünftige (z. B. Standard-) Einstellungen verfügen, werden diese Meldungen höchstwahrscheinlich auch in derkern.log
Protokolldatei angezeigt.so kannst du etwas machen wie:
quelle
/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-beendenMit 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. Indmesg -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 habendmesg|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 tuntail -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.quelle
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:
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.
quelle
Auf Systemen, die
systemd
Sie verwenden, können Sie auch:quelle
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.
quelle