Ist es möglich, die Ausgabe von` dmesg `zu`tail-f'?

Ich möchte so etwas wie

dmesg | tail -f

Aber es funktioniert nicht:

Ich benutze Mac OS X v10.6.7 (Snow Leopard). Auf diese Weise wird tail beendet, anstatt die Ausgabe zu überwachen.

Ich frage mich, ob es einen Weg gibt, dies zu tun, oder einen gleichwertigen Befehl.

P. S. ich glaube nicht, dass ein while - Schleife wird eine ausreichend gute Idee.

Author: Peter Mortensen, 2011-05-26

13 answers

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

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

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

Überprüfen Sie auch die Verwendung von multitail zum Datei-und Farbcode und Filtern mehrerer Protokolldateien gleichzeitig.

Edit: Das war nicht sehr relevant, als ich das beantwortet habe, aber da diese Seite viele Treffer bekommt, denke ich es erwähnenswert, dass neuere Systeme, auf denen systemd ausgeführt wird, dies haben.

dmesg -w
 152
Author: Caleb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-04-02 10:36:09

Unter Linux können Sie seit Kernel Kernel 3.5.0 Folgendes verwenden:

dmesg -w

Auch auf Systemen mit systemd können Sie Folgendes verwenden:

journalctl -kf
 58
Author: Maxim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-10-28 18:43:08

Mach es einfach @#$%ing work

  1. Sie möchten die Ausgabe von dmesg ständig 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 nun das freundliche Proc-Handbuch lesen, wird es Sie streng warnen, nur einen Benutzer (der privilegiert sein muss) gleichzeitig /proc/kmsg lesen zu lassen. Welche Syslog-Implementierung Sie auch haben sollten tun Sie dies und vermutlich funktioniert es mit dmesg. Ich weiß nicht, ich bin aus meiner Liga hier, nur das Handbuch paraphrasieren. Während dies der Weg" just make it @#$%ing work " ist, sollten Sie zuerst die nächsten Methoden in Betracht ziehen.

Manpage genehmigt: watch + dmesg

Auf einer Linux-Box verwende ich mit systemd init*, dmesg.log wird nicht sehr oft geschrieben, vielleicht überhaupt nicht? Der beste Weg, den Kernel-Protokollpuffer kontinuierlich zu lesen,ist mit watch. So etwas sollte Ihnen den Einstieg erleichtern (passen Sie an, wie viele Zeilen in Ihr Terminal passen):

watch 'dmesg | tail -50'

Uhr + dmesg + daemon + tail-f

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

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

* Tangente, cause this gibt es eine Frage zu einem Apple Desktop-Betriebssystem: Wenn systemd vorhanden ist, kümmern Sie sich nicht um dmesg; Verwenden Sie journalctl -xf (möglicherweise mit -n 100, um auch die vorherigen 100 Zeilen anzuzeigen)

 56
Author: djeikyb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-08 22:42:31

Hier ist eine Variante von djeikybs Antwort ,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 dmesg -c machen, wodurch der Ringpuffer nach dem Drucken gelöscht wird - also drucken wir jedes Mal nur, was seit dem letzten Mal neu ist.

Du musst root sein, um das zu tun, also das sudo. Es gibt auch einen Bugfix; Anstatt zu versuchen, die Ausgabe in eine Datei zu speichern und an den Schwanz weiterzuleiten (was nicht funktioniert), lesen wir nur aus der neu geschriebenen Datei.

Wir könnten einfach dmesg > /tmp/dmesg.log und überschreiben die ganze Datei jede Iteration, aber das ist eine Menge E / A und riskiert auch die Datei zu verlieren, wenn der Computer in der Mitte eines Überschreibens abstürzt.

Sie könnten auch etwas Ähnliches tun, das näher an tail -f mit einer while Schleife liegt, die dmesg -c und sleep 1 für immer ausführt (siehe Ben Harris ' Antwort). Da dies jedoch den Kernel-Nachrichtenpuffer während der Ausführung löscht, möchten Sie möglicherweise auch Dinge weiterleiten in eine Logdatei, falls Sie sie später wollen.

 21
Author: Brooks Moses,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-08 02:40:46

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 unnötig, wenn Sie root sind. Wenn Sie der Meinung sind, dass dies zu viel von Ihrer CPU-Ressource verbraucht, versuchen Sie, eine 'Sleep 1' hinzuzufügen, bevor die Schleife abgeschlossen ist.

 7
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-05-26 22:05:47

Ich habe dies zu sehen, bevor Sie diese veröffentlichen:

#!/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
Author: Quantum Mechanic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-08 02:41:44

Hier sind einige Ideen für begrenzte Umgebungen

Umgebungen wie Embedded oder Pre-Boot, in denen watch, tail, cat, dd und andere Befehle möglicherweise nicht verfügbar sind, benötigen möglicherweise andere Funktionen.

Dies ist, was einige leichte Linux-Distributionen tun:

while dmesg -c >> /tmp/dmesg.log; do sleep 0.1; done & tail -f /tmp/dmesg.log

Es hinterlässt die while-Schleife (mit&), während die generierte Ausgabe verfolgt wird.

Wenn Sie nicht in /tmp schreiben können:

mount -t tmpfs - /tmp 

# or 
mount -t ramfs - /tmp 

# or use /dev/shm instead of /tmp - which is available in newer environments

Wenn du keinen Schwanz hast, kannst du

cat /tmp/dmesg.log

# or 
dd if=/tmp/dmesg.log 

# or
dd if=/tmp/dmesg.log 2>/dev/null

, Oder Sie könnte in einer Busybox-Umgebung sein, in der dmesg nicht verknüpft ist, dann nur:

busybox dmesg -c

Möglicherweise müssen Sie auch

busybox sleep

Statt Schlafen

Wenn Sie nicht schlafen:

while dmesg -c; do echo >/dev/null; done 

Wenn Sie "dmesg"nicht haben:

while sleep 0.1; do cat -v /proc/kmsg; done

Dies funktioniert nur, wenn von hier aus nichts anderes gelesen wird. Möglicherweise haben Sie auch ein /dev/kmsg.

Bonus-Tipp:

Wenn Sie nicht wissen, was Sie haben, und Sie haben nicht "ls", nur:

busybox ls

# or simply:

echo *
 4
Author: Dagelf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-11 06:52:51

Sie könnten tun können:

tail -f /var/log/messages
 3
Author: Ed L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-08 02:33:18

Ich benutze diesen Alias in / root/.bashrc;

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

, das dmesg folgt und die Linien für jedes Terminal anpasst, in dem es aufgerufen wird.

edit: Wie viele Leute darauf hingewiesen haben, ist es seit Kernel 3.5.0 so einfach wie dmesg -w.

 3
Author: drgibbon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-09-03 03:01:35

Wie wäre es damit:

dmesg | tail -f /dev/stdin
 1
Author: Phil Bouchard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-09-11 05:31:26

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

while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered  -o $pattern \
| ...
 0
Author: rzr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-08 02:53:31

Unter dem aktuellen Ubuntu (ich verwende Ubuntu 12.04 (Präzise Pangolin)),

tail -f /var/log/syslog
6< <( cat /var/log/syslog |grep -F  'kernel: '; sudo cat /proc/kmsg) cat /dev/fd/6

(der Befehl sudo benötigt die Berechtigung sudo )

Bitte versuchen Sie auch ein anderes wie: 6

 0
Author: Bill Zhao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-25 12:42:43

Dies könnte nützlich sein:

Dmesg | tail-f -

Leitet die Ausgabe von dmesg durch tail mit dem Operator - als Verknüpfung zur Standardausgabe.

 -3
Author: Random Linux Dood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-08 02:47:19