題 `cat / proc / kmsg`輸出破文


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)?


4
2018-04-13 23:38


起源


看到這個答案: stackoverflow.com/questions/1783630/... - Randolf Richardson
此外,這個網頁表明它是一個環形緩衝區,所以“tail -f”和朋友可能無法正常工作(使用“dmesg”而不是像“tail -f”那樣不能監視): techpulp.com/blog/tag/prockmsg - Randolf Richardson
從Linux 3.5開始,一個新的 /dev/kmsg 接口已經實現,它允許多個進程讀取內核日誌而不會損壞 cat /dev/kmsg 將自動關注新條目。 (UTIL Linux的 2.22也實施 dmesg --follow。) - grawity


答案:


看來輸出了 cat /proc/kmsg 因為可能有其他內核日誌記錄數據的消費者,比如syslogd和朋友,所以會出現亂碼。對我來說,輸出字符交錯到cat或syslogd(在Ubuntu 12.04上試過)。另見這個答案: https://stackoverflow.com/a/9477776/496009

我可以想像, cat /proc/kmsg 在引導到原始系統時可以正常工作(例如,內核啟動時使用 init=/bin/sh 參數)。否則,使用 dmesg 讀取內核日誌的命令預計會更容易。


2
2017-12-29 19:17



是否有dmesg連續打印所有消息(期望 watch "dmesg | tail")? - Vi.
@Vi。:如果你運行Linux內核≥3.5,你應該可以做到 cat /dev/kmsg 甚至 dmesg --follow (要求util-linux≥2.22)。在舊系統上,您唯一的選擇是 tail -f 中的syslog文件 /var/log。 - grawity


我遇到了問題 cat /proc/kmsg 由於它試圖顯示不可打印的字符而過早退出。

我發現:

cat -v /proc/kmsg

從輸出中刪除所有不可打印的字符並阻止 cat 從過早退出。


0
2018-04-20 12:41



我不認為這是因為那些人物。 - Vi.