我怎样才能看到 dmesg 输出的变化?

Mil*_*avi 188 linux command-line logs dmesg

我正在编写一个将错误消息打印到环形缓冲区dmesg 输出的设备驱动程序。我想看到dmesg它改变时的输出。

我怎样才能做到这一点?

max*_*zig 242

比较近dmesg的版本提供了后续的选项-w--follow它的工作原理类似)tail -f

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

$ dmesg -wH
Run Code Online (Sandbox Code Playgroud)

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

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

  • 哇一个使用 --descriptively-named-flags 而不是神秘的单字符标志的系统管理员答案。太棒了,先生。好样的。 (4认同)
  • 不错的发现!Gentoo 不理解“-H”,但在其他方面很合适 (2认同)
  • `-w` 应该适用于 Utopic (14.10) 以后的每个版本的 Ubuntu。(https://launchpad.net/ubuntu/+source/util-linux/+publishinghistory 表明早期的 Utopic 软件包适用于 2.20,但在发布时已达到 2.25。) (2认同)

pet*_*rph 64

您可以使用watch专门用于此类操作的命令

watch -n 0.1 "dmesg | tail -n $((LINES-6))"
Run Code Online (Sandbox Code Playgroud)

$((LINES-6))部件应使其非常适合您的终端。

  • 如果您使用单引号而不是双引号(或转义美元符号),则每次调用都会获得 $LINES 的新值,因此如果您更改终端大小,它将进行调整。 (6认同)
  • 这就是重点。当 shell 将参数传递给 `watch` 时,单引号禁止变量扩展,因此 watch 将执行带有变量表达式的命令,它将被它调用的 shell 扩展。每一次。试试吧,它有效。 (3认同)

uml*_*ute 14

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

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

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

 tail -f /var/log/kern.log
Run Code Online (Sandbox Code Playgroud)

  • `tail -f /var/log/{messages,kernel,dmesg,syslog}` 通过 [超级用户:is-it-possible-to-tail-f-the-output-of-dmesg](http://superuser. com/questions/289239/is-it-possible-to-tail-f-the-output-of-dmesg) (2认同)

mic*_*has 11

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

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

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

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

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


小智 9

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

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

$ while true; do dmesg -c ; sleep 1 ; done
Run Code Online (Sandbox Code Playgroud)

您可以使用Ctrl+退出循环C。sleep 1 是为了阻止它不必要地打击 CPU,并且 -c 标志会在每次调用时清除缓冲区,这样您就不会每秒看到重复的输出。

  • 对于调试 android 确实很有用。 (2认同)

Max*_*xim 5

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

# journalctl -kf
Run Code Online (Sandbox Code Playgroud)

  • Ubuntu 14.10:➜ ~ journalctl -kf 未找到日志文件。 (2认同)