如何查看dmesg输出的变化情况?


Answers:


178

相对较新的dmesg版本提供了跟-w--follow选项,其作用类似于tail -f

因此,只需使用以下命令:

$ dmesg -wH

-H--human启用用户友好的功能,例如颜色,相对时间)

这些选项在Fedora 19中可用。


2
好发现!Gentoo不会抱怨,-H但要注意一点
unperson325680

用户空间工具的版本必须为2.22+。Ubuntu用户必须等待14.10版“ utopic”
Daniel Alder

1
Ubuntu不需要-w-需要使用手表(下)
Brent Faust

2
哇,系统管理员回答使用--descriptively-named-flags而不是神秘的单字符标志。布拉沃先生 布拉沃
allyourcode '16

1
-w从Utopic(14.10)起,应该可以在所有版本的Ubuntu中使用。(launchpad.net/ubuntu/+source/util-linux/+publishinghistory建议早期的Utopic软件包适用于2.20,但在发行时已达到2.25。)
mwfearnley

54

您可以使用watch专门用于此类事情的命令

watch -n 0.1 "dmesg | tail -n $((LINES-6))"

$((LINES-6))零件应使其很好地适合您的终端。


2
如果使用单引号而不是双引号(或转义美元符号),则每次调用都会获得$ LINES的新值,因此如果更改终端大小,它将进行调整。
P爸爸

单引号将抑制变量扩展。此外,在此示例中,变量仅扩展一次-调用时watch。因此,在的调用之间它不会真正改变dmesg。可能需要使用一种包装来查询终端状态。
peterph '16

2
这就是重点。当外壳程序将参数传递给时,单引号禁止变量扩展watch,因此watch将执行其中包含变量表达式的命令,该命令将由其调用的外壳程序进行扩展。每一次。试试吧,它有效。
P Daddy

嗯,您是对的-我假设watch使用popen(),这意味着会生成另一个shell,然后由它提供环境变量(并因此在每次执行运行时更新)。好发现。
彼得'16

12

您无法真正dmesg直接监视的输出。

但是,很有可能您的模块没有直接打印到dmesg的环形缓冲区中,而是使用了内核日志记录工具(然后将通过显示dmesg)。如果您syslog具有一些合理的设置(例如,默认设置),则这些消息很可能也会显示在kern.log日志文件中。

因此您可以执行以下操作:

 tail -f /var/log/kern.log

/var/log/kern.log是特定于Linux的。对于OpenBSD(可能还有其他),dmesg内容已记录在/ var / log / messages中。当然,还有其他一些东西。
kurtm 2013年

2
tail -f /var/log/{messages,kernel,dmesg,syslog}通过超级用户:是否有可能将dmesg的输出尾部
在这里

9

您用于dmesg获取内核的日志消息。

内核本身登录到环形缓冲区,即仅在内存中。现在所有dmesg要做的就是输出该环形缓冲区的内容。如果这样做dmesg -c,此后还将删除环形缓冲区。

因此,您可以做一些类似的while true; do dmesg -c; sleep 1; done事情,例如a不工作dmesg|tail。但这会删除环形缓冲区,因此需要root用户权限。

另一种方法是/proc/kmsg允许查看环形缓冲区的文件。您可以这样做tail -f /proc/kmsg,但这仅允许一个进程,而这通常是您的日志记录守护程序。-它的工作是读取消息并将其写入实际文件(通常在/ var / log中),以便在其中读取它们。可以将其配置为将所有消息输出到单个文件,或将不同部分输出到不同文件。(但是配置取决于系统的日志记录守护程序。)

因此,请查看/var/log是否有适合您需要的文件,否则请配置日志记录守护程序。


//,在我正在使用的CEntOS 6系统上,拖尾和查看/ proc / kmsg不会产生任何输出。[〜] $ sudo tail -f / proc / kmsg♥%[〜] $ sudo cat / proc / kmsg♥%[〜] $
Nathan Basanese

8

如果您使用的是嵌入式系统,则OpenWRT等系统上常见的busybox功能非常有限,仅支持2-3个标志。

如果您想要一种快速而又肮脏的方式在事件发生时连续在屏幕上打印dmesg输出,那么简单的bash循环就可以了。这并不理想,但是正如我提到的BusyBox dmesg缺少许多功能。输入命令行后,我发现以下效果相同:

$ while true; do dmesg -c ; sleep 1 ; done

您可以使用Ctrl-C退出循环,睡眠1是停止不必要地破坏CPU,并且-c标志清除每次调用时的缓冲区,因此您看不到每秒重复的输出,


1
对于调试android真的很有用。
2017年


0

从单独的终端使用以下两个命令:

  1. while true; do dmesg -c >> test.txt;sleep 1; done
  2. tail -f test.txt

它将达到类似的结果。


//,这基本上指示dmesg将输出附加到test.txt,对吗?第二个命令只是监视那个test.txt文件?
弥敦道(Nathan Basanese),2015年

谢谢..是的..第二个命令监视dmesg的更改。cat / proc / kmsg可以实现类似的输出,但是不会将日志保存到文件中。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.