Ist es möglich, die Ausgabe von "dmesg" "tail -f" zu setzen?

137

Willst du so etwas tun?

dmesg | tail -f

Aber es funktioniert nicht: Ich verwende Mac OS X 10.6.7, dadurch wird der Tail beendet, anstatt die Ausgabe zu überwachen.

Ich frage mich, ob es eine Möglichkeit gibt, dies zu tun, oder einen entsprechenden Befehl. PS, ich glaube nicht, dass eine whileSchleife eine gute Idee sein wird.

Ivan ZG Xiao
quelle
das funktioniert einwandfrei auf meiner Ubuntu 10.04LTS Box. Eine Problemumgehung wäre, die Protokolldatei, in die syslog Kernelnachrichten schreibt, zu überarbeiten.
4
Unter Mac OS X lautet diese Datei /var/log/kernel.log
1
@Anonymous 2: Enthält leider kernel.lognicht die gleiche Ausgabe wie dmesg. Zum Beispiel für ein beschädigtes Laufwerk, Datei-Lesefehler in dmesggenau angeben, welche Datei nicht gelesen werden konnte, während kernel.logleider nur die weniger als hilfreiche Hinweis:disk0s2: I/O error.
Ivan Vučica
3
Seit Linux 3.5 können Sie dmesg -w ausführen.
Doug Richardson

Antworten:

120

Sie suchen wahrscheinlich nach einer Kombination von Nachrichten aus verschiedenen Protokolldateien. Versuchen:

tail -f /var/log/{messages,kernel,dmesg,syslog}

... um einen guten Überblick über das System zu bekommen. Wenn Sie mehr oder weniger möchten, suchen Sie in welcher Protokolldatei die Nachrichten abgelegt werden, die Sie sehen möchten.

Sehen Sie sich auch multitailan, wie Sie den Code zum Ablegen und Färben von Dateien verwenden und mehrere Protokolldateien gleichzeitig filtern können.

Bearbeiten: Dies war nicht sehr relevant, als ich darauf antwortete, aber da diese Seite eine Menge Hits bekommt, denke ich, dass es erwähnenswert ist, dass neuere Systeme, auf denen systemd ausgeführt wird, dies haben.

dmesg -w
Caleb
quelle
5
Vielen Dank für das Heads-up multitail. Sieht interessant aus. Im Fall von O X wird es so etwas wie: tail -f /var/log/{system.log,kernel.log}.
Boehj
2
system.logund kernel.logenthalten nicht die genaue Ausgabe von dmesgunter OS X. Bei einem beschädigten Laufwerk geben beispielsweise die Fehler beim Lesen von Dateien dmesggenau an, welche Datei nicht gelesen werden konnte. kernel.logLeider enthält sie nur den weniger hilfreichen Hinweis:disk0s2: I/O error.
Ivan Vučica,
3
Diese Antwort funktioniert nicht unter OS X Mavericks (10.9) oder Arch Linux.
Elle Mundy
@Dan On Arch Sie haben wahrscheinlich keinen Syslog-Daemon installiert oder dessen Dienst aktiviert. Ich habe bemerkt, dass dies nicht Teil des Basispakets ist, obwohl es ziemlich grundlegend ist. OSX basiert auf BSD und hat für viele Dinge unterschiedliche Pfade. Sie müssen herausfinden, wie und wo Ihr System die Protokollierung und Anpassung handhabt. Meine Antwort ist ziemlich allgemein und deckt die meisten FHS-basierten Distributionen mit aktiviertem Syslog ab, aber es gibt auch viele Variantenimplementierungen.
Caleb
1
++ beim bearbeiten.
Pstanton
56

Lass es einfach funktionieren

  1. Sie möchten die Ausgabe von dmesg ständig und sofort drucken
  2. Dmesg druckt den Kernel-Ringpuffer (siehe man dmesg)
  3. Der Kernel-Ringpuffer ist eine spezielle Proc-Datei /proc/kmsg(siehe man proc).
  4. Lesen Sie /proc/kmsgdirekt, dh cat /proc/kmsg.

Wenn Sie jetzt das freundliche Proc-Handbuch lesen, werden Sie streng gewarnt, dass nur ein Benutzer (der privilegiert sein muss) gleichzeitig lesen darf /proc/kmsg. Unabhängig davon, welche Syslog-Implementierung Sie haben, sollten Sie dies tun, und vermutlich funktioniert dies auch dmesg. Ich weiß nicht, ich bin hier nicht in meiner Liga, nur um das Handbuch zu umschreiben. Also, während dies die Art und Weise ist, wie "es einfach machen @ # $% ing funktioniert", betrachten Sie zuerst die nächsten paar Methoden.

Manpage freigegeben: watch + dmesg

Auf Arch Gnu / Linux mit systemd init * wird dmesg.log nicht sehr oft geschrieben, vielleicht gar nicht? Die beste Möglichkeit, den Kernel-Protokollpuffer kontinuierlich zu lesen, ist mit watch. So etwas sollte Ihnen den Einstieg erleichtern (passen Sie an, wie viele Leitungen in Ihr Terminal passen):

watch 'dmesg | tail -50'

watch + dmesg + daemon + tail -f

Eine komplexere Lösung könnte watch verwenden, um die dmesg-Ausgabe in eine Datei zu schreiben, die Sie dann verwenden könnten tail -f. Sie möchten wahrscheinlich, dass dies als Daemon ausgeführt wird. Ein richtiger Daemon würde auch Protokolle gzipen und rotieren. Der folgende Bash-Code ist nicht getestet, funktioniert nicht und soll nur eine Idee vermitteln. @ Brooks Moses Antwort hat eine funktionierende Version .

watch 'dmesg >> /var/log/dmesg.log | tail -1'

* tangens, weil dies eine osx-Frage ist, aber wenn systemd in der Nähe ist, kümmere dich nicht darum dmesg, benutze journalctl -xf(vielleicht w /, -n 100um auch die vorherigen 100 Zeilen anzuzeigen )

djeikyb
quelle
1
OS X hat dies nicht /proc, der Rest Ihrer Antwort ist jedoch zutreffend. watchkann von MacPorts installiert werden: macports.org
Ivan Vučica
@Ivan Vučica Ah, gut zu wissen.
Ich frage
2
Sieht aus wie es direkt im Kernel-Speicher ist. Quellcode für Apples dmesgImplementierung: opensource.apple.com/source/system_cmds/system_cmds-230.7/… Quick Googling erwähnt nichts darüber, dass es im Dateisystem vertreten ist: /
Ivan Vučica 28.10.11
42

Für Linux-Interessierte ab Kernel 3.5.0:

# dmesg -w

Auch auf Systemen mit systemdIhnen können:

# journalctl -kf
Maxime
quelle
6
dmesg -wist die absolut netteste Lösung. Leider scheint auch Ubuntu 14.04 nicht dafür bereit zu sein, da das User Space Tool dies noch nicht unterstützt.
Daniel Alder
1
Diese Antwort verdient definitiv mehr Gegenstimmen.
m4tx
2
Ja, das ist ein schönes kleines Nugget. kann lesbar gemacht werden mit: dmesg -wH
faustus
21

Hier ist eine Variante der Antwort von djeikyb, die tatsächlich getestet wurde und einige Fehler behebt.

watch 'sudo dmesg -c >> /tmp/dmesg.log; tail -n 40 /tmp/dmesg.log'

Der wichtige Trick ist, dass wir dies tun dmesg -c, um den Ringpuffer nach dem Drucken zu löschen - also jedes Mal, wenn wir nur das drucken, was seit dem letzten Mal neu ist. Du musst root sein, um das zu tun sudo. Es gibt auch einen Bugfix; Anstatt zu versuchen, die Ausgabe in eine Datei zu kopieren und sie an das Ende zu leiten (was nicht funktioniert), lesen wir nur aus der neu geschriebenen Datei.

Wir könnten bei dmesg > /tmp/dmesg.logjeder Iteration einfach die gesamte Datei überschreiben, aber das ist eine Menge E / A und birgt auch das Risiko, die Datei zu verlieren, wenn der Computer während eines Überschreibvorgangs abstürzt.

Sie könnten auch etwas Ähnliches tun , die wie enger ist tail -fmit einer while - Schleife , die ausgeführt wird dmesg -cund für sleep 1immer (Ben Harris Antwort sehen). Da hierdurch der Kernel-Nachrichtenpuffer während der Ausführung tatsächlich gelöscht wird, möchten Sie möglicherweise auch Elemente in eine Protokolldatei umleiten, falls Sie sie später benötigen.

Brooks Moses
quelle
6

Dies kann für Sie arbeiten

while true;do sudo dmesg -c;done

Beachten Sie, dass das Flag '-c' den Nachrichtenpuffer in stdout löscht. Das 'sudo' ist nicht notwendig, wenn Sie root sind. Wenn Sie der Meinung sind, dass dies zu viel von Ihrer CPU-Ressource beansprucht, fügen Sie vor Abschluss der Schleife eine "Sleep 1" hinzu.


quelle
Sieh es dir vielleicht gut an, wenn du die ganze Zeit auf dem Bildschirm bist
Seth Robertson
2
Fühlen Sie sich frei, Ihre Quellen zu zitieren: linuxforums.org/forum/applications/…
2
Schnell und dreckig. Schmutzig, weil es nur funktioniert, wenn Sie der einzige Benutzer sind, der dies tut. Andernfalls erhält jeder Benutzer nur die Hälfte der Nachrichten
Daniel Alder
löst mein android adb problem.
PAntoine
5

Haben Sie dies getan, bevor Sie diesen Beitrag gesehen haben:

#!/usr/bin/env perl

use strict;
use warnings;

# "tail -f" for dmesg
# Keeps last printed line. Anything sorting "gt" will be newer

$|=1;

my $y = '';

while(1) {
    for my $k (`dmesg`) {
        if ($k gt $y) {
            print $k;
            $y = $k;
        }
    }        
    sleep 1;
}
exit;
Quantenmechaniker
quelle
3

Sie könnten in der Lage sein zu tun:

tail -f /var/log/messages
Ed L
quelle
2
Auf den meisten Systemen ist die dmesg-Protokolldatei nur ein statischer Speicherauszug des dmesg-Puffers nach Abschluss des Systemstarts. Danach werden alle neuen Kernelmeldungen normalerweise in eine andere Protokolldatei verschoben, und die dmesg-Datei bleibt bis zum Neustart unverändert.
7
Ich kenne die "meisten" Systeme nicht, aber keines der von mir administrierten GNU Linux-Systeme verhält sich so. dmesgmeldet einen aktuellen Satz der neuesten Nachrichten aus dem Kernel, normalerweise spezifisch für die Hardware-Subsysteme.
Caleb
3

während dmesg -c >> /tmp/dmesg.log; schlafe 0,1; erledigt & tail -f /tmp/dmesg.log

Dagelf
quelle
Bitte erläutern Sie, warum dies eine Lösung ist.
ChrisF
Das machen einige Distributionen hinter den Kulissen. Der Kernel-Ringpuffer wird abgefragt und alle 0,1 Sekunden in einem Hintergrundjob in /tmp/dmesg.log protokolliert, während die Ausgabe abgefangen wird. Dies ist auch die einzige Methode, die funktioniert, wenn im Hintergrund nichts Besonderes ausgeführt wird oder wenn Sie alle Hintergrundprozesse und -dienste beendet und eine Notfall-Fehlerbehebung durchgeführt haben.
Dagelf
1
Scheint einfacher zu bedienenwatch
Poolie
Wenn Sie es zur Verfügung haben :-) Manchmal befinden Sie sich in einer Umgebung, in der Sie nicht einmal einen Schwanz haben ... Dann können Sie cat /tmp/dmesg.log oder dd even ... verwenden. Wenn Sie nicht schreiben können nach / tmp und kann -t tmpfs - / tmp oder ramfs nicht mounten oder nach / dev / shm / ... schreiben, dann können Sie einfach dmesg -c; Schlaf 0,1; Echo ausführen> / dev / null; fertig, wenn du nicht schläfst, nur während dmesg -c; mache ein Echo> / dev / null; getan; Manchmal hast du nicht mal ls ... dann machst du einfach echo * :-D
Dagelf
2

Ich benutze diesen Alias ​​in /root/.bashrc;

alias dwatch='watch -n 0.1 "dmesg | tail -n $((LINES-6))"'

Dies folgt auf dmesg und passt die Zeilen für jedes Terminal an, in dem es aufgerufen wird.

Drgibbon
quelle
0

Unter dem aktuellen Ubuntu (ich benutze Ubuntu 12.04),

tail -f /var/log/syslog

kann die Anforderung erfüllen.

Bill Zhao
quelle
0

Ich habe diesen Code verwendet, um nach einem speziellen Kernel-Ereignis zu suchen, und habe einen "Rückruf" -Prozess eingeleitet:

while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered  -o $pattern \
| ... 
rzr
quelle
-2

Antwort auf eine alte Frage, aber jemand könnte es nützlich finden :)

dmesg | Schwanz -f -

Leiten Sie die Ausgabe von dmesg mit dem Operator - als Verknüpfung zu stdout durch tail

Random Linux Dood
quelle
2
Dies ist der Code aus der Frage, der nicht funktioniert.
Pabouk
2
Es funktioniert nicht, da dmesgdie Ausgabe nach dem einmaligen Schließen geschlossen wird. tail -fkann das nicht mehr ändern.
Daniel Alder