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?
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?
Antworten:
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.
-Haber sonst genau richtig
-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.)
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.
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.
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.
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.
tail -f /var/log/{messages,kernel,dmesg,syslog}via superuser: ist-es-möglich-die-ausgabe-von-dmesg-zu-beenden
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.
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 systemdSie verwenden, können Sie auch:
# journalctl -kf
Verwenden Sie diese 2 Befehle von verschiedenen Terminals:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtEs wird ein ähnliches Ergebnis erzielen.