dmesg与printk命令
用于檢測和控制內核環緩沖。程序用來助用戶了解系統的啟動信息
Linux命令dmesg用來顯示開機信息,kernel會將開機信息存儲在ring buffer中
開機信息保存在/var/log目錄中名稱為dmesg的文件里
dmesg [ -c ] [ -n 級別 ] [ -s 緩沖區大小 ]- 1
-c?
清除環緩沖內的內容?
-s 緩沖區大小?
定義一個大小為”緩沖區大小”的緩沖區用于查詢內核環緩沖區。默認大小為 8196(此大小與 2.0.33 和 2.1.103 內核的默認syslog 緩沖區大小一致),如果你設置了一個大于默認值的環緩沖區,那你就可以用這個選項定義一個相當的緩沖區來查看完整的環緩沖區內容?
-n級別?
設置級別為記錄控制臺啟動信息的級別。比如,-n 1指的就是將此級別設為最低級,除了內核恐慌信息之外不會向控制臺顯示信息。所有級別的啟動信息還將記錄到/proc/kmsg,文件中,因此,syslogd(8)同樣可以用來對信息的輸出進行控制。當使用-n選項時,dmesg將不會清除內核環緩沖區中的內容。當同時使用以上兩個選項時,只有最后一個選項才會產生效果。
要將linux內核的帶級別控制的printk內容打印出來,在命令行 輸入 dmesg -n 8 就將所有級別的信息都打印出來
printk() 使用說明
內核通過 printk() 輸出的信息具有日志級別,日志級別是通過在 printk() 輸出的字符串前加一個帶尖括號的整數來控制的,如 printk("<6>Hello, world!/n");。內核中共提供了八種不同的日志級別,在 linux/kernel.h 中有相應的宏對應。
#define KERN_EMERG????? "<0>"??? /* system is unusable */??
#define KERN_ALERT????? "<1>"??? /* action must be taken immediately */??
#define KERN_CRIT?????? "<2>"??? /* critical conditions */??
#define KERN_ERR??????? "<3>"??? /* error conditions */??
#define KERN_WARNING??? "<4>"??? /* warning conditions */??
#define KERN_NOTICE???? "<5>"??? /* normal but significant */??
#define KERN_INFO?????? "<6>"??? /* informational */??
#define KERN_DEBUG????? "<7>"??? /* debug-level messages */?
#define KERN_EMERG????? "<0>"??? /* system is unusable */
#define KERN_ALERT????? "<1>"??? /* action must be taken immediately */
#define KERN_CRIT?????? "<2>"??? /* critical conditions */
#define KERN_ERR??????? "<3>"??? /* error conditions */
#define KERN_WARNING??? "<4>"??? /* warning conditions */
#define KERN_NOTICE???? "<5>"??? /* normal but significant */
#define KERN_INFO?????? "<6>"??? /* informational */
#define KERN_DEBUG????? "<7>"??? /* debug-level messages */
所以 printk() 可以這樣用:printk(KERN_INFO "Hello, world!/n");。
未指定日志級別的 printk() 采用的默認級別是 DEFAULT_MESSAGE_LOGLEVEL,這個宏在 kernel/printk.c 中被定義為整數 4,即對應KERN_WARNING。
在 /proc/sys/kernel/printk 會顯示4個數值(可由 echo 修改),分別表示當前控制臺日志級別、未明確指定日志級別的默認消息日志級別、最小(最高)允許設置的控制臺日志級別、引導時默認的日志級別。當 printk() 中的消息日志級別小于當前控制臺日志級別時,printk 的信息(要有/n符)就會在控制臺上顯示。但無論當前控制臺日志級別是何值,通過 /proc/kmsg (或使用dmesg)總能查看。另外如果配置好并運行了 syslogd 或 klogd,沒有在控制臺上顯示的 printk 的信息也會追加到 /var/log/messages.log 中。
通過讀寫/proc/sys/kernel/printk文件可讀取和修改控制臺的日志級別。查看這個文件的方法如下:
| #cat /proc/sys/kernel/printk 6 4 1 7 |
上面顯示的4個數據分別對應控制臺日志級別、默認的消息日志級別、最低的控制臺日志級別和默認的控制臺日志級別。
可用下面的命令設置當前日志級別:
| # echo 8 > /proc/sys/kernel/printk |
另外為了防止 printk() 瞬時被調用次數過多,可以通過 printk_ratelimit() 來控制速度。printk_ratelimit() 通過跟蹤發送到控制臺的消息數量工作,當輸出速度超過一個臨界值,就返回零。可通過修改 /proc/sys/kernel/{printk_ratelimit, printk_ratelimit_burst} 來調節 printk_ratelimit() 的計算。
printk_ratelimit() 的典型用法如下:
if (printk_ratelimit())
??? printk(KERN_INFO "Hello, world!/n");
參看:
http://blog.csdn.net/zhenwenxian/article/details/4336211
http://blog.csdn.net/zhangxuechao_/article/details/50783298
總結
以上是生活随笔為你收集整理的dmesg与printk命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网晚报 | 3月13日 星期日 |
- 下一篇: MAX3232和MAX232的具体差别