it-swarm.com.de

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

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 denke nicht, dass eine while Schleife eine gute Idee ist.

131
Ivan Z. G. Xiao

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 an, wie Sie mit multitail mehrere Protokolldateien gleichzeitig filtern und den Code abspeichern können.

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

dmesg -w
113
Caleb

Lass es einfach @ # $% ing 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/kmsg direkt, dh cat /proc/kmsg.

Wenn Sie jetzt das freundliche Proc-Handbuch lesen, werden Sie streng gewarnt, dass jeweils nur ein Benutzer (der privilegiert sein muss) /proc/kmsg lesen darf. Unabhängig davon, welche Syslog-Implementierung Sie haben, sollten Sie dies tun, und vermutlich funktioniert es mit dmesg. Ich weiß nicht, ich bin hier nicht in meiner Liga, nur um das Handbuch zu paraphrasieren. 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 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 kompliziertere Lösung könnte watch verwenden, um dmesg-Ausgaben in eine Datei zu schreiben, die Sie dann tail -fieren können. Sie möchten wahrscheinlich, dass dies als Daemon ausgeführt wird. Ein richtiger Daemon würde auch Protokolle gzipen und drehen. Der folgende Bash-Code ist nicht getestet, funktioniert nicht und soll nur eine Idee vermitteln. @ Brooks Moses Antwort hat eine Arbeitsversion .

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 um dmesg, benutze journalctl -xf (vielleicht w/-n 100, um auch die vorherigen 100 Zeilen anzuzeigen)

55
djeikyb

Für Linux-Interessierte ab Kernel 3.5.0:

# dmesg -w

Auch auf Systemen mit systemd können Sie:

# journalctl -kf
41
Maxim

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 besteht darin, dass wir dmesg -c ausführen, wodurch der Ringpuffer nach dem Drucken gelöscht wird. Daher wird jedes Mal, wenn wir durchlaufen, nur das gedruckt, was seit dem letzten Mal neu ist. Dafür musst du root sein, also die 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 nur dmesg > /tmp/dmesg.log ausführen und die gesamte Datei bei jeder Iteration überschreiben, aber das ist eine Menge E/A-Aufwand und birgt auch das Risiko, die Datei zu verlieren, wenn der Computer während eines Überschreibvorgangs abstürzt.

Sie können auch etwas Ähnliches wie tail -f mit einer while-Schleife ausführen, die dmesg -c und sleep 1 für immer ausführt (siehe Antwort von Ben Harris). Da hierdurch der Kernel-Nachrichtenpuffer während der Ausführung tatsächlich gelöscht wird, möchten Sie möglicherweise auch Dinge in eine Protokolldatei umleiten, falls Sie sie später benötigen.

21
Brooks Moses

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 Beendigung der Schleife eine "Sleep 1" hinzu.

6
Ben Harris

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;
5

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

3
Dagelf

sie könnten in der Lage sein zu tun:

tail -f /var/log/messages
3
Ed L

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.

2
drgibbon

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 \
| ... 
0
rzr

Unter dem aktuellen Ubuntu (ich benutze Ubuntu 12.04),

tail -f /var/log/syslog

kann die Anforderung erfüllen.

0
Bill Zhao