我正在编写一个将错误消息打印到环形缓冲区 dmesg输出中的设备驱动程序。我想看到dmesg
它变化的输出。
我怎样才能做到这一点?
我正在编写一个将错误消息打印到环形缓冲区 dmesg输出中的设备驱动程序。我想看到dmesg
它变化的输出。
我怎样才能做到这一点?
Answers:
相对较新的dmesg
版本提供了跟(-w
。--follow
)选项,其作用类似于tail -f
。
因此,只需使用以下命令:
$ dmesg -wH
(-H
,--human
启用用户友好的功能,例如颜色,相对时间)
这些选项在Fedora 19中可用。
-H
但要注意一点
-w
从Utopic(14.10)起,应该可以在所有版本的Ubuntu中使用。(launchpad.net/ubuntu/+source/util-linux/+publishinghistory建议早期的Utopic软件包适用于2.20,但在发行时已达到2.25。)
您可以使用watch
专门用于此类事情的命令
watch -n 0.1 "dmesg | tail -n $((LINES-6))"
该$((LINES-6))
零件应使其很好地适合您的终端。
watch
。因此,在的调用之间它不会真正改变dmesg
。可能需要使用一种包装来查询终端状态。
watch
,因此watch将执行其中包含变量表达式的命令,该命令将由其调用的外壳程序进行扩展。每一次。试试吧,它有效。
watch
使用popen()
,这意味着会生成另一个shell,然后由它提供环境变量(并因此在每次执行运行时更新)。好发现。
您无法真正dmesg
直接监视的输出。
但是,很有可能您的模块没有直接打印到dmesg的环形缓冲区中,而是使用了内核日志记录工具(然后将通过显示dmesg
)。如果您syslog
具有一些合理的设置(例如,默认设置),则这些消息很可能也会显示在kern.log
日志文件中。
因此您可以执行以下操作:
tail -f /var/log/kern.log
/var/log/kern.log
是特定于Linux的。对于OpenBSD(可能还有其他),dmesg内容已记录在/ var / log / messages中。当然,还有其他一些东西。
tail -f /var/log/{messages,kernel,dmesg,syslog}
通过超级用户:是否有可能将dmesg的输出尾部
您用于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
是否有适合您需要的文件,否则请配置日志记录守护程序。
如果您使用的是嵌入式系统,则OpenWRT等系统上常见的busybox功能非常有限,仅支持2-3个标志。
如果您想要一种快速而又肮脏的方式在事件发生时连续在屏幕上打印dmesg输出,那么简单的bash循环就可以了。这并不理想,但是正如我提到的BusyBox dmesg缺少许多功能。输入命令行后,我发现以下效果相同:
$ while true; do dmesg -c ; sleep 1 ; done
您可以使用Ctrl-C退出循环,睡眠1是停止不必要地破坏CPU,并且-c标志清除每次调用时的缓冲区,因此您看不到每秒重复的输出,
在使用的系统上,systemd
您还可以:
# journalctl -kf
从单独的终端使用以下两个命令:
while true; do dmesg -c >> test.txt;sleep 1; done
tail -f test.txt
它将达到类似的结果。