dmesg与printk命令
用于檢測和控制內(nèi)核環(huán)緩沖。程序用來助用戶了解系統(tǒng)的啟動信息
Linux命令dmesg用來顯示開機信息,kernel會將開機信息存儲在ring buffer中
開機信息保存在/var/log目錄中名稱為dmesg的文件里
dmesg [ -c ] [ -n 級別 ] [ -s 緩沖區(qū)大小 ]- 1
-c?
清除環(huán)緩沖內(nèi)的內(nèi)容?
-s 緩沖區(qū)大小?
定義一個大小為”緩沖區(qū)大小”的緩沖區(qū)用于查詢內(nèi)核環(huán)緩沖區(qū)。默認(rèn)大小為 8196(此大小與 2.0.33 和 2.1.103 內(nèi)核的默認(rèn)syslog 緩沖區(qū)大小一致),如果你設(shè)置了一個大于默認(rèn)值的環(huán)緩沖區(qū),那你就可以用這個選項定義一個相當(dāng)?shù)木彌_區(qū)來查看完整的環(huán)緩沖區(qū)內(nèi)容?
-n級別?
設(shè)置級別為記錄控制臺啟動信息的級別。比如,-n 1指的就是將此級別設(shè)為最低級,除了內(nèi)核恐慌信息之外不會向控制臺顯示信息。所有級別的啟動信息還將記錄到/proc/kmsg,文件中,因此,syslogd(8)同樣可以用來對信息的輸出進(jìn)行控制。當(dāng)使用-n選項時,dmesg將不會清除內(nèi)核環(huán)緩沖區(qū)中的內(nèi)容。當(dāng)同時使用以上兩個選項時,只有最后一個選項才會產(chǎn)生效果。
要將linux內(nèi)核的帶級別控制的printk內(nèi)容打印出來,在命令行 輸入 dmesg -n 8 就將所有級別的信息都打印出來
printk() 使用說明
內(nèi)核通過 printk() 輸出的信息具有日志級別,日志級別是通過在 printk() 輸出的字符串前加一個帶尖括號的整數(shù)來控制的,如 printk("<6>Hello, world!/n");。內(nèi)核中共提供了八種不同的日志級別,在 linux/kernel.h 中有相應(yīng)的宏對應(yīng)。
#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() 采用的默認(rèn)級別是 DEFAULT_MESSAGE_LOGLEVEL,這個宏在 kernel/printk.c 中被定義為整數(shù) 4,即對應(yīng)KERN_WARNING。
在 /proc/sys/kernel/printk 會顯示4個數(shù)值(可由 echo 修改),分別表示當(dāng)前控制臺日志級別、未明確指定日志級別的默認(rèn)消息日志級別、最小(最高)允許設(shè)置的控制臺日志級別、引導(dǎo)時默認(rèn)的日志級別。當(dāng) printk() 中的消息日志級別小于當(dāng)前控制臺日志級別時,printk 的信息(要有/n符)就會在控制臺上顯示。但無論當(dāng)前控制臺日志級別是何值,通過 /proc/kmsg (或使用dmesg)總能查看。另外如果配置好并運行了 syslogd 或 klogd,沒有在控制臺上顯示的 printk 的信息也會追加到 /var/log/messages.log 中。
通過讀寫/proc/sys/kernel/printk文件可讀取和修改控制臺的日志級別。查看這個文件的方法如下:
| #cat /proc/sys/kernel/printk 6 4 1 7 |
上面顯示的4個數(shù)據(jù)分別對應(yīng)控制臺日志級別、默認(rèn)的消息日志級別、最低的控制臺日志級別和默認(rèn)的控制臺日志級別。
可用下面的命令設(shè)置當(dāng)前日志級別:
| # echo 8 > /proc/sys/kernel/printk |
另外為了防止 printk() 瞬時被調(diào)用次數(shù)過多,可以通過 printk_ratelimit() 來控制速度。printk_ratelimit() 通過跟蹤發(fā)送到控制臺的消息數(shù)量工作,當(dāng)輸出速度超過一個臨界值,就返回零。可通過修改 /proc/sys/kernel/{printk_ratelimit, printk_ratelimit_burst} 來調(diào)節(jié) 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
總結(jié)
以上是生活随笔為你收集整理的dmesg与printk命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网晚报 | 3月13日 星期日 |
- 下一篇: MAX3232和MAX232的具体差别