web-dev-qa-db-ja.com

`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を3回押しました。1回目は改行なしで壊れたテキストを印刷しました。2回目は正しいテキストを印刷しました。3回目は終了したばかりです(EOF)。

私は何が間違っているのですか?カーネルメッセージを追跡する方法(さまざまなsysklogdファイルと構成ファイルおよびtail -fに依存しない)。

または、klogdを使用して、syslogやcat /proc/kmsgなしでメッセージ(klogd: Already runningのように正しい)を出力する方法は?

4
Vi.

cat /proc/kmsgの出力は、syslogdやfriendsなど、カーネルログデータの他のコンシューマーが存在する可能性があるため、文字化けしているようです。私の場合、出力文字はインターリーブでcatまたはsyslogdに送られます(Ubuntu 12.04で試してみました)。この回答も参照してください: https://stackoverflow.com/a/9477776/496009

cat /proc/kmsgは、元のシステムで起動したときに確実に機能すると想像できます(たとえば、カーネルはinit=/bin/sh引数で起動されます)。それ以外の場合は、dmesgコマンドを使用してカーネルログを読み取る方が簡単です。

2
pfalcon

私は問題を抱えていましたcat /proc/kmsg印刷できない文字を表示しようとしたため、途中で終了しました。

私はそれを見つけました:

cat -v /proc/kmsg

印刷できない文字をすべて出力から削除し、catが途中で終了するのを防ぎます。

0
user3913384