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
(see man proc
)
- Read
/proc/kmsg
directly, ie cat /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 Arch gnu/linux 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 an osx question, but when systemd is around, don't bother with dmesg
, use journalctl -xf
(maybe w/ -n 100
to also show the previous 100 lines)