cat /proc/kmsg
是跟踪内核消息的便捷方式。但输出不可靠。例如:
< eoyfl-o-ilF ilaltssI hwflssesJ a hwbctaealatv-psL hwmmr-sg()nc-l-TtssN oeOfso-eitr()so-l-iesQ na ycso-aksae()Umutfref()so-lce-ak()Wiet_e_yr upfrc-ufrZ <6>[640655.817496] SysRq : HELP : loglevel(0-9) reBoot Crash terminate-all-tasks(E) memory-full-oom-kill(F) kill-all-tasks(I) thaw-filesystems(J) saK show-backtrace-all-active-cpus(L) show-memory-usage(M) nice-all-RT-tasks(N) powerOff show-registers(P) show-all-timers(Q) unRaw Sync show-task-states(T) Unmount force-fb(V) show-blocked-tasks(W) Write_to_dev_sysrq dump-ftrace-buffer(Z)
(我按了三次 Alt+Sysrq+h:第一次它打印了没有换行符的残缺文本。第二次它打印了正确的文本。第三次它刚刚退出(EOF)。
我做错了什么?如何跟踪内核消息(不依赖各种 sysklogd 和配置文件等tail -f
)。
或者,如何使用 klogd 仅打印消息(类似cat /proc/kmsg
但正确)而不打印任何系统日志或klogd: Already running
)?
答案1
似乎输出cat /proc/kmsg
是乱码,因为可能还有其他内核日志数据使用者,如 syslogd 和朋友。对我来说,输出字符会交错地发送到 cat 或 syslogd(在 Ubuntu 12.04 上尝试过)。另请参阅此答案:https://stackoverflow.com/a/9477776/496009
我可以想象,cat /proc/kmsg
当启动到原始系统时(例如,使用init=/bin/sh
参数启动的内核),它会可靠地工作。否则,使用dmesg
命令读取内核日志预计会更容易。
答案2
cat /proc/kmsg
由于它试图显示不可打印的字符,我遇到了过早退出的问题。
我发现:
cat -v /proc/kmsg
从输出中删除所有不可打印的字符并防止cat
过早退出。