Is it possible to `tail -f` the output of `dmesg`?
Solution 1
You are probably looking for some combination of messages from various log files. Try:
tail -f /var/log/{messages,kernel,dmesg,syslog}
…to get a pretty good overview of the system. If you want more or less than that, research what log file the messages you want to see are being placed in.
Also look into using multitail
to file and color code and filter multiple log files at once.
Edit: This wasn't very relevant when I answered this, but as this page gets a lot of hits I'm thought it worth mentioning that newer systems running systemd have this.
dmesg -w
Solution 2
On Linux, since kernel kernel 3.5.0 you can use:
dmesg -w
Also on systems with systemd
you can use:
journalctl -kf
Solution 3
Just make it @#$%ing work
- You want to print output of dmesg, constantly, immediately
- Dmesg is printing the kernel ring buffer (see
man dmesg
) - The kernel ring buffer is a special proc file,
/proc/kmsg
(seeman proc
) - Read
/proc/kmsg
directly, iecat /proc/kmsg
.
Now, if you read the friendly proc manual, it'll sternly warn you to let only one user (who must be privileged) read /proc/kmsg
at a time. Whatever syslog implementation you have should be doing this, and presumably it works with dmesg
. I dunno, I'm out of my league here, just paraphrasing the manual. So while this is the "just make it @#$%ing work" way, consider the next couple methods first.
Man page approved: watch + dmesg
On one linux box I use with systemd init*, dmesg.log isn't written to very often, perhaps not at all? The best way I found to read the kernel log buffer continuously is with watch
. Something like this should get you started (adjust for how many lines fit in your terminal):
watch 'dmesg | tail -50'
watch + dmesg + daemon + tail -f
A more convoluted solution might use watch to write dmesg output to file, which you could then tail -f
. You'd probably want this running as a daemon. A proper daemon would also gzip and rotate logs. The following bash code is untested, unworking, and only intended to convey an idea. @Brooks Moses's answer has a working version.
watch 'dmesg >> /var/log/dmesg.log | tail -1'
* tangent, cause this is a question about an apple desktop os: when systemd is around, don't bother with dmesg
; use journalctl -xf
(maybe w/ -n 100
to also show the previous 100 lines)
Solution 4
Here's a variant on djeikyb's answer that's actually tested, and fixes a couple of bugs.
watch 'sudo dmesg -c >> /tmp/dmesg.log; tail -n 40 /tmp/dmesg.log'
The important trick is that we're doing dmesg -c
, which clears the ring buffer after it prints -- thus, each time through we're only printing what's new since the last time.
You'll need to be root to do that, thus the sudo
. There's also a bugfix; instead of trying to both dump the output to a file and pipe it to tail (which doesn't work), we're just reading from the newly-written file.
We could do just dmesg > /tmp/dmesg.log
and overwrite the whole file each iteration, but that's a lot of I/O and also risks losing the file if the computer crashes in the middle of an overwrite.
You could also do something similar that's more closely like tail -f
with a while
loop that executes dmesg -c
and sleep 1
forever (see Ben Harris's answer). However, since this is actually clearing the kernel message buffer as it's running, you may also want to pipe things into a logfile in case you want them later.
Solution 5
I did this before seeing this post:
#!/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;
Related videos on Youtube
Comments
-
Ivan Xiao over 1 year
I want to do something like
dmesg | tail -f
but it doesn't work:
I use Mac OS X v10.6.7 (Snow Leopard). By doing that,
tail
will exit, instead of monitoring the output.I wonder if there is a way to do it, or an equivalent command.
P.S., I don't think a
while
loop will be a good enough idea.-
Admin almost 13 yearsthat works fine on my Ubuntu 10.04LTS box. A workaround would be to tail whatever logfile that syslog is putting kernel messages into.
-
Admin almost 13 yearsOn Mac OSX, that file is /var/log/kernel.log
-
Admin almost 13 years@Marc Sorry I added my machine spec now. @bobDevil That is cool, but seems that the output is different from dmesg. However this one looks nicer
-
Admin over 12 years@Anonymous 2: Unfortunately,
kernel.log
does not contain the same output asdmesg
. For example, for a damaged drive, file read errors indmesg
specify exactly which file could not be read, whilekernel.log
unfortunately provides only the less-than-helpful notice:disk0s2: I/O error.
-
Admin over 9 yearsSince linux 3.5, you can do dmesg -w.
-
Admin almost 9 years
-
Admin over 4 yearsYou can do
sudo dmesg >> "$TMPDIR/dmesg.log"; tail -f "$TMPDIR/dmesg.log"
on Mac. -
Admin over 4 yearsPerhaps change the accepted answer to Maxim's answer? It is 2020 and most users would like to find that answer first, I think.
-
-
Admin almost 13 yearswatch might be good there, if you are watching the screen all of the time
-
Admin almost 13 yearsFeel free to cite your sources: linuxforums.org/forum/applications/…
-
boehj almost 13 yearsThanks for the heads-up re:
multitail
. Looks interesting. In the case of OS X it'll be something like:tail -f /var/log/{system.log,kernel.log}
. -
user3376703 almost 13 yearsI don't know about "most" systems, but none of the GNU Linux systems I admin behave that way.
dmesg
reports a current set of the latest messages from the kernel, usually specific to the hardware subsystems. -
Ivan Vučica over 12 yearsOS X does not have
/proc
, however the rest of your answer is applicable.watch
can be installed from MacPorts: macports.org -
Ivan Vučica over 12 years
system.log
andkernel.log
do not contain the exact output ofdmesg
on OS X. For example, for a damaged drive, file read errors indmesg
specify exactly which file could not be read, whilekernel.log
unfortunately provides only the less-than-helpful notice:disk0s2: I/O error.
-
djeikyb over 12 years@Ivan Vučica Ah, good to know. Wonder where OSX represents the kernel ring buffer..
-
Ivan Vučica over 12 yearsLooks like it's directly in the kernel memory. Source code for Apple's
dmesg
implementation: opensource.apple.com/source/system_cmds/system_cmds-230.7/… Quick Googling doesn't mention anything about it being represented in the filesystem :/ -
ChrisF about 11 yearsPlease can you explain why this is a solution.
-
Dagelf almost 11 yearsIt's what some distributions do behind the scenes. It polls the kernel ringbuffer and logs it to /tmp/dmesg.log every 0.1 seconds in a background job while it tails that output. Also, it's the only method that will work if you don't have something special running in the background - or if you've killed all background processes and services and you're doing emergency troubleshooting.
-
Elle Mundy over 10 yearsFor the record, this answer doesn't work on OS X Mavericks (10.9) or Arch Linux.
-
user3376703 over 10 years@Dan On Arch you probably don't have a syslog daemon installed or its service enabled. I've noticed that isn't part of the base package set even though it's pretty fundamental. OSX is BSD based and has different paths for a lot of things. You'll need to figure out how and where your system handles logging and adjust. My answer is pretty generic and covers most FHS based distros with syslog enabled, but there are also lots of variant implementations.
-
pabouk - Ukraine stay strong over 10 yearsThis is the code from the question which does not work.
-
user1527227 almost 10 yearsI'm running ubuntu 14.04 and the following tells me whether the link is up or down:
sudo tail -f /var/log/kern.log
-
Daniel Alder over 9 yearsIt doesn't work because
dmesg
closes output after closing once.tail -f
can't change this anymore. -
Admin over 9 yearsQuick and dirty. Dirty because it only works if you are the only one user doing this. Otherwise each user gets only half of the messages
-
Daniel Alder over 9 years
dmesg -w
is the absolutely nicest solution. Unfortunately, even Ubuntu 14.04 doesn't seem to be ready for this because the user space tool doesn't support it yet. -
m4tx about 9 yearsThis answer definately deserves more upvotes now.
-
faustus over 8 yearsyes, this is a nice little nugget. can be made human readable with: dmesg -wH
-
Admin about 8 yearssolves my android adb problem.
-
poolie almost 7 yearsSeems simpler to use
watch
-
Dagelf almost 7 yearsIf you have it available :-) sometimes you're in an environment where you don't even have tail... then you can use cat /tmp/dmesg.log, or dd even... If you can't write to /tmp, and can't mount -t tmpfs - /tmp, or ramfs, or write to /dev/shm/... then you can just while dmesg -c; sleep 0.1; do echo >/dev/null; done, if you don't have sleep, just while dmesg -c; do echo >/dev/null; done; Sometimes you don't even have ls... then you just do echo * :-D
-
pstanton about 6 years++ on the edit.
-
Peter Mortensen over 4 yearsIn the answer, not in comments. Can the answer be updated?
-
Peter Mortensen over 4 yearsThis does not work - it just displays the last 10 lines and stops. Tried on Ubuntu 19.10 (Eoan Ermine).
-
Peter Mortensen over 4 yearsThis works on Ubuntu 19.10 (Eoan Ermine).
-
drgibbon over 3 yearsJust to point out that
dmesg -w
is not dependent on systemd. -
gaoithe over 3 years
dmesg -Hw
common useful options for human readable + tail. -
ipatch about 3 yearsthe author of the question specifies macos, why provide answers for GNU+Linux?
-
whydoubt over 2 yearsThis merely tails the current dmesg 'state', then hangs out without returning to the command prompt. It will not have the desired effect, because dmesg (without the -w parameter) exits once it completes outputting the current 'state'.