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.
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
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
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
- Sie möchten die Ausgabe von dmesg ständig sofort drucken
- Dmesg druckt den Kernel-Ringpuffer (siehe
man dmesg
) - Der Kernel-Ringpuffer ist eine spezielle Proc-Datei,
/proc/kmsg
(sieheman proc
) - Lesen Sie
/proc/kmsg
direkt, dhcat /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)
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.
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.
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;
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 *
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
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
.
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
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 \
| ...
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
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.
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