想做类似的事情
dmesg | tail -f
但它不起作用:我使用Mac OSX 10.6.7,这样做是尾部将退出,而不是监视输出。
我想知道是否有任何方法或任何等效命令。PS,我认为while
循环不会是一个好主意。
kernel.log
没有包含与相同的输出dmesg
。例如,对于损坏的驱动器,文件读取错误中dmesg
指定了无法读取的文件,而kernel.log
不幸的是,该通知仅提供了不到帮助的通知:disk0s2: I/O error.
想做类似的事情
dmesg | tail -f
但它不起作用:我使用Mac OSX 10.6.7,这样做是尾部将退出,而不是监视输出。
我想知道是否有任何方法或任何等效命令。PS,我认为while
循环不会是一个好主意。
kernel.log
没有包含与相同的输出dmesg
。例如,对于损坏的驱动器,文件读取错误中dmesg
指定了无法读取的文件,而kernel.log
不幸的是,该通知仅提供了不到帮助的通知:disk0s2: I/O error.
Answers:
您可能正在寻找来自各种日志文件的消息的某种组合。尝试:
tail -f /var/log/{messages,kernel,dmesg,syslog}
…以获得对该系统的很好的概述。如果您想要更多或更少,请研究将要查看的消息放入哪个日志文件。
还应考虑使用multitail
文件和颜色代码并一次过滤多个日志文件。
编辑:当我回答此问题时,这不是很相关,但是由于此页面获得了很多点击,我认为值得一提的是运行systemd的较新系统具有此功能。
dmesg -w
multitail
。看起来很有趣。对于OS X,它将类似于:tail -f /var/log/{system.log,kernel.log}
。
system.log
并且kernel.log
不包含dmesg
OS X上的确切输出。例如,对于损坏的驱动器,文件读取错误中dmesg
准确指定了无法读取的文件,而kernel.log
不幸的是,该通知仅提供了以下有用的提示:disk0s2: I/O error.
man dmesg
)/proc/kmsg
(请参阅参考资料man proc
)/proc/kmsg
直接阅读,即cat /proc/kmsg
。现在,如果您阅读了友好的proc手册,它将严格警告您一次只允许一个用户(必须具有特权)阅读/proc/kmsg
。无论您使用哪种syslog实现,都应该这样做,并且大概可以使用dmesg
。我不知道,我在手册外解释了我。因此,尽管这是“仅使@#$%ing工作”的方式,但请首先考虑以下两种方法。
在具有systemd init *的Arch gnu / linux上,dmesg.log很少被写入,也许根本不被写入?我发现连续读取内核日志缓冲区的最佳方法是使用watch
。这样的事情应该会让您入门(调整终端中可容纳的行数):
watch 'dmesg | tail -50'
更复杂的解决方案可能是使用watch将dmesg输出写入文件,然后可以将其写入tail -f
。您可能希望此程序作为守护程序运行。适当的守护程序还将gzip并旋转日志。以下bash代码未经测试,不起作用,仅用于传达想法。@Brooks Moses的答案有一个有效的版本。
watch 'dmesg >> /var/log/dmesg.log | tail -1'
*切线,因为这是一个osx问题,但是当systemd在附近时,不要理会dmesg
,请使用journalctl -xf
(也许-n 100
还显示前100行)
dmesg
实现的源代码:opensource.apple.com/source/system_cmds/system_cmds-230.7/…快速谷歌搜索没有提到它在文件系统中的表示:/
对于那些对linux感兴趣的人,从3.5.0内核开始:
# dmesg -w
同样在systemd
您可以使用的系统上:
# journalctl -kf
dmesg -w
是绝对最佳的解决方案。不幸的是,甚至Ubuntu 14.04似乎都还没有为此做好准备,因为用户空间工具尚不支持它。
这是djeikyb答案的一种变体,已经经过实际测试,并修复了一些错误。
watch 'sudo dmesg -c >> /tmp/dmesg.log; tail -n 40 /tmp/dmesg.log'
重要的技巧是我们正在执行dmesg -c
,它会在打印后清除环形缓冲区-因此,每次通过时,我们仅打印自上次以来的新内容。您需要具有root才能做到这一点,因此sudo
。还有一个错误修正;我们只是尝试从新写入的文件中读取数据,而不是尝试将输出转储到文件中并通过管道发送到尾部(这不起作用)。
我们可以这样做,dmesg > /tmp/dmesg.log
并在每次迭代时覆盖整个文件,但这会产生大量I / O,并且如果计算机在覆盖过程中崩溃,则可能会丢失文件。
你也可以做类似的东西,更紧密地就像tail -f
while循环,执行dmesg -c
和sleep 1
永远的(见本·哈里斯的答案)。但是,由于这实际上是在内核消息缓冲区运行时清除它,因此您可能还希望将其通过管道传送到日志文件中,以备日后使用。
这可能对你有用
while true;do sudo dmesg -c;done
请记住,'-c'标志会将消息缓冲区清除到stdout中。如果您是root用户,则不需要'sudo'。如果您觉得这占用了过多的CPU资源,请在循环完成之前尝试添加“ sleep 1”。
而dmesg -c >> /tmp/dmesg.log; 睡0.1; 完成&尾-f /tmp/dmesg.log
watch