我正在编写一个将错误消息打印到环形缓冲区dmesg输出中的设备驱动程序。
我想查看dmesg的输出,因为它发生了变化。

我该怎么做?

评论

superuser.com/questions/289239/…

#1 楼

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

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

$ dmesg -wH


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

这些选项例如在Fedora 19中可用。

评论


好发现! Gentoo不会抱怨-H,否则会发现

–mike3996
13-10-13在16:19

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

–丹尼尔·奥尔德(Daniel Alder)
2014年8月25日在7:41

Ubuntu不会-w-需要使用watch(下)

–布伦特·浮士德
16-2-24在0:19

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

–allyourcode
16年4月2日在4:59

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

–mwfearnley
17年8月20日在13:58

#2 楼

您可以使用恰好适合此类操作的watch命令

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


$((LINES-6))部分应使其完全适合您的终端。

评论


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

– P爸爸
16-3-31在15:22

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

–彼得
16年4月2日在14:29

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

– P爸爸
16年4月2日在14:37

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

–彼得
16年4月2日在15:14

这是macOS的唯一选项,因为它提供的dmseg不实现-w标志。

– ijoseph
20-09-27在20:59

#3 楼

您不能真正直接监视dmesg的输出。

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

所以您可以执行以下操作:

 tail -f /var/log/kern.log


评论


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

–kurtm
13-10-13在14:27

通过超级用户通过-f / var / log / {messages,kernel,dmesg,syslog}结束:是否可以尾随f-dmesg的输出

–这里
2014年5月2日,7:55

#4 楼

您可以使用dmesg获取内核的日志消息。

内核本身登录到环形缓冲区,即仅在内存中。
现在,所有dmesg所做的就是输出该环形缓冲区的内容。
如果执行dmesg -c,也会随后删除环形缓冲区。

因此,您可以执行类似while true; do dmesg -c; sleep 1; done的操作,使其具有与无法正常工作的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
2015年9月4日在19:36

/ dev / kmsg更好。 unix.stackexchange.com/a/294206/5132

– JdeBP
20年1月8日在16:22

#5 楼

如果您使用的是嵌入式系统(例如OpenWrt等系统上常见的BusyBox),则其功能非常有限,并且仅支持2-3个标志。

如果您想要一种快速而肮脏的打印方式随着事件的变化,屏幕上的dmesg输出会不断变化,一个简单的Bash循环就可以正常工作。这并不理想,但是正如我提到的,BusyBox dmesg缺少许多功能。我发现在命令行中输入以下内容具有相同的效果:

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


您可以使用Ctrl + C退出循环。sleep1是停止它不必要地浪费CPU资源,并且-c标志清除每次调用时的缓冲区,因此您不会看到每秒重复的输出。

评论


对于调试android真的很有用。

–val说恢复莫妮卡
17年8月30日在11:22

#6 楼

在使用systemd的系统上,您还可以:

# journalctl -kf


评论


Ubuntu 14.10:➜〜journalctl -kf未找到日志文件。

– Nathan Basanese
15年5月6日在11:46

#7 楼

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


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

将实现类似的结果。

评论


//,这基本上指示dmesg将输出附加到test.txt,对吗?第二个命令只是监视那个test.txt文件?

– Nathan Basanese
2015年9月4日在19:31

谢谢..是的..第二个命令监视dmesg的更改。 cat / proc / kmsg可以实现类似的输出,但是不会将日志保存到文件中。

– K_K
2015年9月7日下午6:56